使用指定的语言环境 (sv) 和 NumberFormat 将字符串解析为 Long

Posted

技术标签:

【中文标题】使用指定的语言环境 (sv) 和 NumberFormat 将字符串解析为 Long【英文标题】:Parse String to Long using a specified locale (sv) and NumberFormat 【发布时间】:2014-10-08 10:50:59 【问题描述】:

我尝试使用以下代码在 Java 中使用瑞典语言环境将字符串 (14 123) 解析为 long:

String longString = "14 123"
NumberFormat swedishNumberFormat = NumberFormat.getInstance(new Locale("sv"));
System.out.println(swedishNumberFormat.parse(longString).longValue());

这段代码的输出是 14(应该是 14123)。根据this question,我尝试使用 sv 和 sv_SE 语言环境,但这次两种情况下的结果是相同的。

根据http://www.localeplanet.com/java/sv/index.html 和http://www.localeplanet.com/java/sv-SE/index.html,这两种情况下的分组分隔符都是一个空格()那么为什么要长解析的字符串不能处理一个,对于语言环境,正确格式化的双精度值存储为字符串?

【问题讨论】:

Java 中瑞典语语言环境中的错误? 对我来说,下面的这个问题和答案比标记为相关的要好。我认为这个问题不应该结束。 【参考方案1】:

瑞典语和法语一样,都需要努力。不间断的空间。

longString = longString.replace(' ', '\u00a0');

麻烦。

【讨论】:

@GameDroids 是的,使用不间断空格作为分组分隔符是一个完全具有误导性的设计决定。也许他们想防止在format 生成的数字上出现断字。【参考方案2】:

你可以试试

使用手动设置的 DecimalFormat 解析该字符串。构造它,配置为有 setGroupingUsed(true), setDecimalSymbols 和你自己的 DecimalFormatSymbols

DecimalFormat df=new DecimalFormat();
df.setGroupingSize(3);
df.setGroupingUsed(true);
DecimalFormatSymbols newSymbols=new DecimalFormatSymbols();
newSymbols.setGroupingSeparator(' ');
df.setDecimalFormatSymbols(newSymbols);
df.parse(longString)

第二个选项是调试您的代码,查看您拥有的 swedishNumberFormat 实例。检查字段 groupingSize、decimalFormatSymbols.groupingSeparators。

【讨论】:

【参考方案3】:

如this post 中所见,您需要手动将空格设置为分隔符。

 try 
      String longString = "14 123";            
      DecimalFormat decimalFormat = new DecimalFormat();  // instead of NumberFormat, use DecimalFormat
      DecimalFormatSymbols symbols = new DecimalFormatSymbols(new Locale("sv", "SE"));
      symbols.setGroupingSeparator(' ');   // set the whitespace manually as grouping seperator
      decimalFormat.setDecimalFormatSymbols(symbols);           
      System.out.println(svSE.parse(longString)); 
   catch (ParseException ex) 
      Logger.getLogger(Playground.class.getName()).log(Level.SEVERE, null, ex);
  

    //> output is 14123

说实话我有点困惑,但我认为 问题 是,您需要 格式化字符串(显然这里的每个空格都不相同)

 try 
      long testNumber = 123987l; 
      NumberFormat swedishNumberFormat = NumberFormat.getInstance(new Locale("sv")); 

      //here I format the number into a String
      String formatedString = swedishNumberFormat.format(testNumber);  
      System.out.println(formatedString);  // result: "123 987"

      // when parsing the formated String back into a number
      System.out.println(swedishNumberFormat.parse(formatedString));  // result: "123987"

      // but when parsing a non formated string like this one
      System.out.println(swedishNumberFormat.parse("123 987")); // result "123"
  catch (ParseException ex) 
      Logger.getLogger(Playground.class.getName()).log(Level.SEVERE, null, ex);
 

如果我在这里错了或者我的例子不起作用,请纠正我。我不知道它为什么会这样,但是为了避免像上面这样的混乱情况,您可能需要手动设置分隔符。

编辑

正如 Joop Eggen 在他的 answer 中所说,字符串需要使用硬的、不间断的空格 ('\u00a0') 而不是简单的空格。这就是我的示例在最后一行返回“123”的原因(我只使用了普通空格)。

【讨论】:

以上是关于使用指定的语言环境 (sv) 和 NumberFormat 将字符串解析为 Long的主要内容,如果未能解决你的问题,请参考以下文章

04-SV连接设计和测试平台

Win 10环境下6sV2.1模型编译心得

三台ECS使用kubeadm快速部署最新版本K8sv1.21.3

三台ECS使用kubeadm快速部署最新版本K8sv1.21.3

为啥 div 位置在不同的语言环境中发生变化?

R语言随机波动模型SV:马尔可夫蒙特卡罗法MCMC正则化广义矩估计和准最大似然估计上证指数收益时间序列|附代码数据