【问题标题】:Convert String with Dot or Comma to Float Number将带点或逗号的字符串转换为浮点数
【发布时间】:2011-03-08 13:19:44
【问题描述】:

我总是喜欢在我的函数中输入以获取范围从 0.1 到 999.9 的数字(小数部分总是用“.”分隔,如果没有小数则没有“.”,例如 9 或 7。

无论本地化如何,如何将此字符串转换为浮点值(某些国家/地区使用“,”来分隔数字的小数部分。我总是用“。”得到它)?这是否取决于本地计算机设置?

【问题讨论】:

    标签: java


    【解决方案1】:

    Float.parseFloat() 方法不依赖于语言环境。它需要一个点作为小数分隔符。如果您输入的小数点分隔符始终是点,您可以安全地使用它。

    如果您需要适应不同的语言环境,NumberFormat 类提供了语言环境感知解析和格式。

    【讨论】:

      【解决方案2】:
      DecimalFormatSymbols symbols = new DecimalFormatSymbols();
      symbols.setDecimalSeparator('.');
      DecimalFormat format = new DecimalFormat("0.#");
      format.setDecimalFormatSymbols(symbols);
      float f = format.parse(str).floatValue();
      

      【讨论】:

      • 或者,new DecimalFormat("0.#", DecimalFormatSymbols.getInstance(Locale.ENGLISH));
      • 是的,但您依赖于系统设置
      • 怎么样?无论系统设置如何,硬编码英语语言环境都不会使用点分隔符吗?
      • 否:用户可以更改英文数字的格式。
      • 如果您需要进行 1000 次以上的转换,这将非常缓慢。使用下面的解决方案和“替换”以获得更好的速度。
      【解决方案3】:
      valueStr = valueStr.replace(',', '.');
      return new Float(valueStr);
      

      完成

      【讨论】:

      • 这确实是一个糟糕的解决方案.. 对于大量的值,这可能是一个瓶颈。性能真的很差!
      • 为什么?它实际上是一系列原始字符比较,然后创建一个新字符串,然后是一个 parseFloat。创建一个 String 比创建一个 DecimalFormat、DecimalFormatSymbols 或任何这个问题更便宜。把我的观点还给我=)
      • 替换需要解析所有字符串,除非他找到逗号,并且在更改语言环境的情况下不安全。有更好的方法让机制适用于这两种情况。如果您每秒多次使用该函数,那么以这种方式解析字符串可能会成为瓶颈
      • 自然是临时解决方案;只有当您确定您获得的 String double 值肯定会始终使用逗号或点时,它才是安全的。否则,您可以使用带有正则表达式的 replaceAll(String, String) 来一次匹配多种可能的分隔符/分隔符;虽然肯定会慢一些。无论如何,我不知道 DecimalFormat 的内部是如何工作的;但我不知道它会如何更快。即使是这样,在大多数情况下这仍然是一个完全合理的解决方案
      • 这是与速度相关的最佳解决方案,如果您需要进行 1000 次以上的转换,其他的非常非常慢。
      【解决方案4】:

      java.text.NumberFormatDecimalFormat

       NumberFormat nf = new DecimalFormat ("990.0");
       double d = nf.parse (text);
      

      【讨论】:

        【解决方案5】:

        这个呢:

        Float floatFromStringOrZero(String s){
            Float val = Float.valueOf(0);
            try{
                val = Float.valueOf(s);
            } catch(NumberFormatException ex){
                DecimalFormat df = new DecimalFormat();
                Number n = null;
                try{
                    n = df.parse(s);
                } catch(ParseException ex2){
                }
                if(n != null)
                    val = n.floatValue();
            }
            return val;
        }
        

        【讨论】:

          【解决方案6】:

          您可以将占位符 %s-String 用于任何原始类型。

          float x = 3.15f, y = 1.2345f;
          
          System.out.printf("%.4s and %.5s", x, y);
          

          输出:3.15 和 1.234

          %s 始终是英文格式,无论本地化如何。

          如果您想要指定本地格式,您也可以这样做:

          import java.util.Locale;
          
          float x = 3.15f, y = 1.2345f;
          
          System.out.printf(Locale.GERMAN, "%.2f and %.4f", x, y);
          

          输出:3,15 和 1,2345

          【讨论】:

            【解决方案7】:

            希望这段代码对你有帮助。

            public static Float getDigit(String quote){
                    char decimalSeparator = new DecimalFormatSymbols().getDecimalSeparator();
                    String regex = "[^0-9" + decimalSeparator + "]";
                    String valueOnlyDigit = quote.replaceAll(regex, "");
            
                    if (String.valueOf(decimalSeparator).equals(",")) {
                        valueOnlyDigit = valueOnlyDigit.replace(",", ".");
                        //Log.i("debinf purcadap", "substituted comma by dot");
                    }
            
                    try {
                        return Float.parseFloat(valueOnlyDigit);
                    } catch (ArithmeticException | NumberFormatException e) {
                        //Log.i("debinf purcadap", "Error in getMoneyAsDecimal", e);
                        return null;
                    }
                }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-04-21
              • 2022-06-15
              • 2011-10-01
              相关资源
              最近更新 更多