android解析负数字符串

问题描述 投票:0回答:4

如何解析负数字符串?

字符串可能具有以下形式:

-123.23  
(123.23)  
123.23-

是否有一个类可以将上述任何字符串转换为数字?

如果没有,最好的方法是什么?

java string parsing negative-number
4个回答
5
投票

在 WarrenFaiths 答案的基础上,您可以添加以下内容:

Double newNumber = 0;
if(number.charAt(i).isDigit()){
     //parse numeber here using WarrenFaiths method and place the int or float or double 
     newNumber = Double.valueOf(number);
}else{
    Boolean negative = false;

    if(number.startsWith("-") || number.endsWith("-")){
         number = number.replace("-", "");
         negative = true;
    }
    if(number.startsWith("(") || number.endsWith(")"){
        number = number.replace("(", "");
        number = number.replace(")", "");
    }

    //parse numeber here using WarrenFaiths method and place the float or double 
    newNumber = Double.valueOf(number);

    if(negative){
      newNumber = newNumber * -1;
    }
}

抱歉,如果替换方法有误,请指正。


4
投票

"-123.23"
可以用
Float.valueOf("-123.23");
Double.valueOf("-123.23");

进行解析

"(123.23)"
"123.23-"
无效,需要自行改进/解析。您可以逐步检查该字符串并检查它是否是数字,如果是,则将其添加到新字符串中。如果你在开头或结尾找到 - ,请将其设为负数...


0
投票

这是黑客,请评论改进等,是时候自己学习更多了:)

private Double RegNumber(String sIn) {
        Double result = 0E0;
        Pattern p = Pattern.compile("^\\-?([0-9]{0,3}(\\,?[0-9]{3})*(\\.?[0-9]*))");   // -1,123.11
        Matcher m = p.matcher(sIn);
        if (m.matches()) {
            result = Double.valueOf(sIn);
        } else {
            Pattern p1 = Pattern.compile("^\\(?([0-9]{0,3}(\\,?[0-9]{3})*(\\.?[0-9]*))\\)?$");  // (1,123.22)
            Matcher m1 = p1.matcher(sIn);
            if (m1.matches()) {
                String x[] = sIn.split("(\\({1})|(\\){1})"); // extract number
                result = Double.valueOf("-" + x[1]);
            } else {
                Pattern p2 = Pattern.compile("([0-9]{0,3}(\\,?[0-9]{3})*(\\.?[0-9]*))\\-$");  // 1,123.22-
                Matcher m2 = p2.matcher(sIn);
                if (m2.matches()) {
                    String x[] = sIn.split("(\\-{1})"); // extract number
                    result = Double.valueOf("-" + x[0]);
                } else {
                    result = 99999999E99;  // error, big value
                }
            }
        }
        return result;
    }

0
投票

如果想根据 Java 自动处理这个问题,请查看

NumberFormat
DecimalFormat
。 它可以正确处理本地化(例如小数点逗号或小数点,以及如何对大数字进行分组。是否应该是三个一组或其他什么,以及分组字符是否是空格、点或逗号)。

本地化(l10n)很有趣,而且并不简单。 因此,不要采用 hack 解决方案,因为它们会出现问题。这基本上就像计算时间和天数一样。计算一年中的天数并不那么容易(如果您认为您知道如何计算哪一年是闰年,那么您可能是错的)。 两者都不是计算两个日期之间的时间。您会遇到诸如夏季时间和标准时间之间的变化之类的问题,甚至还有闰秒。 一分钟有61秒甚至62秒。

所以不要这样做。

这是一个使用

NumberFormat
DecimalFormat
来格式化和解析数字的 Java 程序。

package se.jackson;

import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.text.ParseException;
import java.util.Locale;

public class UseNumberFormat {

    public static void main(String[] args) throws ParseException {
        System.out.printf("My default locale: %s%n", Locale.getDefault());
        // Get a suitable NumberFormat object, like Localized DecimalFormat.
        // There are some other factory methods, look them up.
        NumberFormat nf = NumberFormat.getNumberInstance();

        // Parse and format with grouping for your locale (for instance 1,234.56 -> 1234.56)
        nf.setGroupingUsed(true);

        if (nf instanceof DecimalFormat) {
            // If subclass of DecimalFormat, then go!
            DecimalFormat df = (DecimalFormat) nf;
            
            System.out.printf("DecimalFormat pattern = %s%n", df.toPattern());
            System.out.printf("DecimalFormat negative prefix = %s%n", df.getNegativePrefix());
            double number = -1234.5678;
            String format = df.format(number); // format
            Number parse = df.parse(format);   // and parse
            System.out.printf("df.format(%f) = \"%s\" df.parse(\"%s\") = %f%n",
                    number, format, format, parse.doubleValue());

            // Set pattern for decimal numbers, mark negative with (1) == -1
            // Notice the negative part after ";". This ignore negativePrefix.
            df.applyPattern("#,##0.###;(#)");
            System.out.printf("DecimalFormat pattern = %s%n", df.toPattern());

            format = df.format(number); // format
            parse = df.parse(format);   // and parse
            System.out.printf("df.format(%f) = \"%s\" df.parse(\"%s\") = %f%n",
                    number, format, format, parse.doubleValue());
        }
        System.exit(0);
    }
}

我运行时的结果将是这样的。

My default locale: sv_SE
DecimalFormat pattern = #,##0.###
DecimalFormat negative prefix = −
df.format(-1234,567800) = "−1 234,568" df.parse("−1 234,568") = -1234,568000
DecimalFormat pattern = #,##0.###;(#,##0.###)
df.fMy default locale: sv_SE
DecimalFormat pattern = #,##0.###
DecimalFormat negative prefix = −
df.format(-1234,567800) = "−1 234,568" df.parse("−1 234,568") = -1234,568000
DecimalFormat pattern = #,##0.###;(#,##0.###)
df.format(-1234,567800) = "(1 234,568)" df.parse("(1 234,568)") = -1234,568000ormat(-1234,567800) = "(1 234,568)" df.parse("(1 234,568)") = -1234,568000

请注意,在此语言环境中,

-
不同。

希望这是在 Java 中解析和格式化数字的一个有用的开始。 不要忘记查看文档。

© www.soinside.com 2019 - 2024. All rights reserved.