【问题标题】:Convert a string into an array or list of floats将字符串转换为数组或浮点数列表
【发布时间】:2012-05-04 22:22:27
【问题描述】:

我有一串由 # 分隔的十四个值

0.1#5.338747#0.0#....等等

我想将每个值从字符串转换为浮点数或将双精度值转换为小数点后 3 位。我可以在很长的时间内完成大部分工作......

str = "0.1#0.2#0.3#0.4";
String[] results;
results = str.split("#");
float res1 = new Float(results[0]);

但我不确定将每个浮点数精确到小数点后 3 位的最佳方法。我也更喜欢用 for 循环之类的简洁的方式来执行此操作,但无法弄清楚。

【问题讨论】:

    标签: java arrays string list


    【解决方案1】:

    四舍五入到小数点后三位...

        String[] parts = input.split("#");
        float[] numbers = new float[parts.length];
        for (int i = 0; i < parts.length; ++i) {
            float number = Float.parseFloat(parts[i]);
            float rounded = (int) Math.round(number * 1000) / 1000f;
            numbers[i] = rounded;
        }
    

    【讨论】:

      【解决方案2】:

      希望这会有所帮助...

      String input = "0.1#5.338747#0.0";
      String[] splittedValues = input.split("#");
      List<Float> convertedValues = new ArrayList<Float>();
      for (String value : splittedValues) {
          convertedValues.add(new BigDecimal(value).setScale(3, BigDecimal.ROUND_CEILING).floatValue());
      }
      

      【讨论】:

        【解决方案3】:

        您可以使用guava

        final String str = "0.1#0.2#0.3#0.4";
        final Iterable<Float> floats = Iterables.transform(Splitter.on("#").split(str), new Function<String, Float>() {
          public Float apply(final String src) {
            return Float.valueOf(src);
          }
        });
        

        或使用 Java API:

        final String str = "0.1#0.2#0.3#0.4";
        final StringTokenizer strTokenizer = new StringTokenizer(str, "#");
        
        final List<Float> floats = new ArrayList<Float>();
        while (strTokenizer.hasMoreTokens()) {
            floats.add(Float.valueOf(strTokenizer.nextToken()));
        }
        

        【讨论】:

        • 不错。不过,你错过了 3 位小数
        • 是的,我是,因为它是一个浮点数,无论如何它不会被削减到小数点后 3 位。
        • 不完全是,是​​的。但是从 OP 的角度来看,5.3390003 可能比5.338747 更好。舍入仍然有一些效果...
        【解决方案4】:
        String str = "0.1#0.2#0.3#0.4";
        String[] results = str.split("#");
        float fResult[] = new float[results.length()];
        for(int i = 0; i < results.length(); i++) {
            fResult[i] = Float.parseFloat(String.format("%.3f",results[i]));
        }
        

        【讨论】:

        • String.format 使用 HALF_EVEN 舍入模式,docs.oracle.com/javase/6/docs/api/java/math/RoundingMode.html 这可能是也可能不是您想要的。此外,您必须警惕 Locales - parseFloat 采用标准表示法(例如 1.23),而 String.format 使用 Locale 并可能输出类似 1,23 的内容,这将导致 parseFloat 抛出 NumberFormatException。
        【解决方案5】:

        考虑到小数点后三位,试试这个:

        public class Test {
            public static void main(String[] args) {
                String str = "0.12345#0.2#0.3#0.4";
                String[] results;
                results = str.split("#");
                float res1 = new Float(results[0]);
                System.out.println("res = " + res1);
                // cut to right accuracy
                res1 = ((int) (res1 * 1000)) / 1000f;
                System.out.println("res = " + res1);
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-10-31
          • 2011-11-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多