2011-09-26 100 views
2

我使用CakePHP構建的應用程序中的幾個表單字段會爲它們的值收集百分比。我希望用戶能夠以熟悉的百分比(24.5%)格式查看和編輯百分比,但爲了簡化計算邏輯,我希望以十進制(.245)格式存儲它。由於有幾個這樣的字段,我寧願不必將每個百分比字段的轉換邏輯寫入控制器。自動轉換百分比輸入值

是否有人知道自動執行此轉換的簡單解決方案,還是我堅持編寫自定義幫助程序/行爲來解決此問題?

解決方案

我最後寫一個jQuery插件處理這個。這是任何人誰可能需要在將來:

/** 
* Input Percent 
* 
* Percentages are tricky to input because users like seeing them as 24.5%, but 
* when using them in calculation their value is actually .245. This plugin 
* takes a supplied field and automatically creates a percentage input. 
* 
* It works by taking an input element and creating a hidden input with the same 
* name immediately following it in the DOM. This has the effect of submitting 
* the proper value instead of the human only one. An onchange method is then 
* bound to the original input in order to keep the two synced. 
* 
* Potential Caveats: 
* * There will be two inputs with the same name. Make sure anything you 
*  script against this field is prepared to handle that. 
*  
* @author Brad Koch <[email protected]> 
*/ 
(function($) { 
  $.fn.inputPercent = function() { 
        return this.each(function() { 
      var display_field = this; 
      var value_field = $('<input type="hidden" />').get(0); 

      // Initialize and attach the hidden input. 
      $(value_field).attr('name', $(this).attr('name')); 
      $(value_field).val($(display_field).val()); 
      $(display_field).after(value_field); 
      $(display_field).after('%'); 

      // Convert the display field's proper percent value into the display format. 
      if (isFinite($(display_field).val())) { 
       $(display_field).val($(display_field).val() * 100); 
      } 

      // Enable synchronization between the two. 
      $(this).bind('change', function() { 
       var value = $(display_field).val(); 

       // Handle non-numeric values. 
       if (isFinite(value)) { 
        $(value_field).val(value/100); 
       } else { 
        $(value_field).val(value); 
       } 
      }); 
        }); 
    }; 
})(jQuery); 

用法:

$('input.percent').inputPercent(); 

回答

2

你可以寫一些簡單的JavaScript(使用任何你喜歡的框架,或純JS),以場轉換與類#percentage的只是提交之前。

另外,也處理沒有JavaScript的用戶;在模型中,添加beforeSave()方法,檢查數字是否爲< 1,如果不是,則除以100.

您也可以添加一個簡單的組件或幫助程序將內部數字轉換回百分比用於顯示,如果NumberHelper不能幫助。

+0

這就是我最終做的。我在這個問題上發佈了這個實現。 –

2

已經有一個幫手這 - NumberHelper

http://book.cakephp.org/view/1455/toPercentage

的我發現的唯一缺點是,如果您將數據存儲爲百分比的十進制表示(即.045 = 4.5%)而不是實際百分比(即.045 = .045%),那麼您轉換前必須乘以100。

即:

<?php echo $this->Number->toPercentage(51.5); // 51.5% ?> 
<?php echo $this->Number->toPercentage(.245 * 100); // 24.5% ?> 
+2

另一種選擇(如果數據來自查詢中的主表,即不是相關表),則使用virtualField。因此,您只需添加一個採用原始字段並即時計算百分比字段的virtualField條目即可。 –

+0

我會一直在視圖中使用助手 - 按需。爲什麼使用虛擬字段如果百分比可能不會在視圖中的任何位置使用? – mark

+1

此解決方案的格式化部分已關閉,但只處理顯示邏輯..我仍然必須自行完成轉換。不幸的是虛擬領域不能解決問題,因爲還有一個報告應用程序正在從這個數據庫中讀取數據。馬克是對的;某些輔助/ JS輸入小部件是我需要的。 –