2015-09-03 28 views
4

我用DecimalFormat df = new DecimalFormat("#,###.00");来格式化BigDecimal用格式化值替换DecimalFormat的分组分隔符

现在,我想要使用该格式化的值(比如'1 250,00')创建new BigDecimal。我试过这个:

BigDecimal result = new BigDecimal(model.getValue().replace(",",".").replace(" ","")); 

但是space在1和2之间的1 250.00没有被替换。我该如何解决它?

例子:

DecimalFormat df = new DecimalFormat("#,###.00"); 
BigDecimal example = new BigDecimal("1250"); 
String str = df.format(example); 
System.out.println(str.replace(",",".").replace(" ","")); 
+1

您可能有不同类型的空白。改用'replaceAll(“\\ s +”,“”)''来代替。 – Mena

+0

试过你的代码,对于'String s =“1 250,00”'它工作正常。所以问题不在于替换方法 – SacJn

+0

@Tunaki,我举了一个例子。尝试一下。如果有帮助,我的本地化是莫斯科/俄罗斯。输出 - 1 250. 00 – Sher

回答

3

DecimalFormat的Javadoc指定符号,是分组分隔符。默认情况下,对于您的区域设置,此分隔符是而不是是一个空格,但是没有空格。这可以通过下面的代码被显示:

DecimalFormatSymbols symbols = new DecimalFormatSymbols(Locale.forLanguageTag("ru-RU")); 
System.out.println((int) symbols.getGroupingSeparator()); 

你会看到打印的int为160,其对应于在"Non-breaking space" ISO-8859-1。

删除该字符,我们可以用它Unicode representation并替换:

DecimalFormat df = new DecimalFormat("#,###.00"); 
String str = df.format(new BigDecimal("1250")); 
System.out.println(str.replace(",", ".").replace("\u00A0", "")); 

对于一个更通用的解决方案,不依赖于当前的语言环境中,我们可以直接检索分组分隔符及用途:

DecimalFormat df = new DecimalFormat("#,###.00"); 
String groupingSeparator = String.valueOf(df.getDecimalFormatSymbols().getGroupingSeparator()); 
String str = df.format(new BigDecimal("1250")); 
System.out.println(str.replace(",", ".").replace(groupingSeparator, "")); 
+0

非常明确的答案。谢谢 – Sher

2

可以使用parse方法从DecimalFormat对象。

df.setParseBigDecimal(true);  
BigDecimal bigDecimal = (BigDecimal) df.parse(model.getValue()); 

查看this SO question中的选定答案。

+0

'df.parse(str)'可以返回除“BigInteger”之外的其他类型,例如它可以返回“Long”。您可能想要将您的解决方案更改为'new BigDecimal(df.parse(model.getValue())。toString());' – Pshemo

+0

如果使用相同的'DecimalFormat'对象格式化和解析数字,它应该可以工作。 –

+0

不一定。 'df.parse(df.format(BigDecimal.ONE))。getClass()'返回类java.lang.Long'给我。 – Pshemo

2

在您的格式

new DecimalFormat("#,###.00"); 

符号,是为分组分隔符。从您的格式中删除符号,后,您将得到输出1250.00(没有分组分隔符在您的案例中空间)。

DecimalFormat df = new DecimalFormat("####.00"); 
BigDecimal example = new BigDecimal("1250"); 
String str = df.format(example); 
System.out.println(str.replace(",",".").replace(" ","")); 

输出:1250.00

有替代(第二)解决方案,它的工作原理,而不会改变您的格式 “# ### 00”。从DecimalFormat的使用.setGroupingSize(0)

DecimalFormat df = new DecimalFormat("#,###.00"); 
df.setGroupingSize(0); 
BigDecimal example = new BigDecimal("1250"); 
String str = df.format(example); 
System.out.println(str); 

输出:1250.00

+0

但是我应该使用','作为装饰目的 – Sher

+0

,您可以使用.setGroupingSize(0),并以您的格式保存。 – Willmore

+0

哪个类的方法是?) – Sher

2

您可以通过使用DecimalFormatSymbols设置分组分隔符(如千位分隔符)人物在你的模式。看起来,在你的区域是不换行的空间,以便尝试将其设置为正常空间像

DecimalFormatSymbols symbols = new DecimalFormatSymbols(Locale.getDefault()); 
symbols.setGroupingSeparator(' ');//simple space 

DecimalFormat df = new DecimalFormat("#,###.00", symbols); 

BigDecimal example = new BigDecimal("1250"); 
String str = df.format(example); 

现在格式化程序会使用简单的空间,因此,您将能够与您的代码来取代它

System.out.println(str.replace(",", ".").replaceAll(" ", "")); 

输出:1250.00

相关问题