2013-05-22 67 views
0

目前我遇到顯示格式化小數的問題。在我的本地機器中,我有一個十進制值:0.002100000000存儲在數據庫中。DecimalFormat正被服務器設置覆蓋

<h:outputText value="0.002100000000" converter="#{bigDecimal4DigitsConverter}" /> 

@FacesConverter("bigDecimal4DigitsConverter") 
public class BigDecimal4DigitsConverter extends BigDecimalConverter { 

    private DecimalFormat format = new DecimalFormat("#,##0.0000"); 

    @Override 
    protected DecimalFormat getDecimalFormat() { 
     return format; 
    } 
} 

我的問題是,它顯示我的本地機器上: 0.0021 - 美國設置 但在另一臺服務器 0,0021 - 法國設置

這是爲什麼?我認爲DecimalFormat,不管區域設置如何格式化小數值?

回答

3

DecimalFormat pattern就像它的名字(和javadoc)所說的那樣是一個純粹的模式。在此模式下,,代表分組分隔符,.代表小數點分隔符。正如MMM代表SimpleDateFormat中的縮寫月份(請注意,它在格式化過程中不會按月格式返回MMM,而是像MayMei(取決於語言環境))。

實際字符格式中被用作分組分隔符和小數點分隔符(和實際文字被用作月份的縮寫)取決於語言環境,完全按照自己的觀察。這是正確的行爲。如果在創建DecimalFormat(或SimpleDateFormat)期間未明確指定區域設置,則將假定Locale#getDefault()提供的默認區域設置。實際上,您應該指定UIViewRoot#getLocale()或者如果您的JSF Web應用程序由於某種不明確的原因而未本地化,則可能是固定的語言環境,如Locale.ENGLISH

另請注意,DecimalFormat(如SimpleDateFormat)不是線程安全的(檢查javadoc中的「同步」部分)。您不應該在類/實例範圍內創建它,而應該在線程局部範圍內(即在與您需要的方法相同的方法塊中)創建它。

我不知道你正在使用的BigDecimalConverterthe standard JSF one沒有getDecimalFormat()方法,所以我不能給出一個更具體的正確方法的例子。

+0

Hi BalusC,再次感謝您的答覆。 BigDecimalConverter只是我們實現的一個bigdecimal faces轉換器。無論如何,我收到你的回覆,我完全誤解了它。我想我現在可以繼續前進。 – czetsuya

+0

爲什麼這不是來自任何地方?我使用JSP頁面和Struts,並且在代碼中發現了一千個我們沒有正確執行此操作的地方,因爲標籤通常不會考慮到這一點。 –