Android解析负数字符串

3
如何解析负数字符串?
这些字符串可能采用以下格式:
-123.23  
(123.23)  
123.23-

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

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


是否存在 (-123.12) 或 (123.12-) 的可能性? - FabianCook
你如何处理? (-123.12) 或 (123.12-) 它们被解析为双重否定,因此是正数吗? - quiricada
是的,在财务方面,负数可以表示为以下形式: -123.23 (123.23) 123.23- 我见过欧洲人将其写成<123.23> 请查看LibreOffice Calc,它会愉快地接受以上所有内容。 - quiricada
3个回答

5
在WarrenFaith的回答基础上,您可以添加以下内容:
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;
    }
}

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


我会使用startsWith和endsWith,而不是contains。 - Jakub Zaverka
好的,我会加入更少的计算。 - FabianCook
1
我建议一种更加可靠的方法:只接受数字,+/-以及./符号,并且丢弃其他所有内容。因此,使用numberString.charAt(i).isDigit()可能是一个好的开始:). 正则表达式也可以消除未使用的字符。 - WarrenFaith
如果我们想要的话,我们可以让它更加复杂:P,正则表达式似乎不是这个人想要使用的东西,这应该对他有用:) - FabianCook
希望有一个通用的类可以解决这个问题,因为大公司使用Java,并且括号中的负数或后缀负号正在使用。正则表达式和if语句将不得不处理。非常感谢。 - quiricada
如果有括号,那么在会计界中它是负数,因此需要将负数设置为true。 - Engineer2021

4
""-123.23"可以使用Float.valueOf("-123.23");Double.valueOf("-123.23");进行解析。

"(123.23)""123.23-"是无效的,需要自行改进/解析。您可以逐步检查字符串是否为数字,如果是,则将其添加到新字符串中。如果您发现在开头或结尾处有一个“-”,则将其变为负数...

"

基于你上面的评论 :D - FabianCook
这是一个技巧,请评论改进等,是时候让我自己学习更多了 :) - quiricada

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;
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接