【问题标题】:android parsing negative number stringsandroid解析负数字符串
【发布时间】:2012-05-13 23:47:19
【问题描述】:

如何解析负数字符串?

字符串可以是以下形式:

-123.23  
(123.23)  
123.23-

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

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

【问题讨论】:

  • 有(-123.12)或(123.12-)的可能性吗?
  • 你是怎么治疗的? (-123.12) 或 (123.12-) 它们被解析为双重否定,因此是肯定的?
  • 是的,负数(在财务方面)可以表示如下:-123.23 (123.23) 123.23- 我见过欧洲人把它写成 checkout libreoffice calc,它会占用一切上述的愉快。

标签: java string parsing negative-number


【解决方案1】:

"-123.23" 可以解析为Float.valueOf("-123.23");Double.valueOf("-123.23");

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

【讨论】:

  • 建立在您上面的评论之上:D
  • 这是 hack,请评论改进等,是时候自己学习更多内容了 :)
【解决方案2】:

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

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

【讨论】:

  • 我会使用startsWith和endsWith来代替contains。
  • 是的,计算量更少,我将添加它。
  • 我会建议一种更防弹的方法:只接受数字、+/- 和 ./ 符号,然后丢弃其他所有内容。所以使用numberString.charAt(i).isDigit() 可能是一个开始:)。正则表达式也可以消除未使用的字符。
  • 如果我们愿意,我们可以让它变得更复杂:P,Regex 似乎还不是这个人想要使用的东西,这应该对他有用 :)
  • 希望有一个通用类来解决这个问题,java 被大公司使用,括号中的负数或后缀负号正在使用。正则表达式和 if 语句将不得不做。非常感谢。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 2012-08-06
    • 1970-01-01
    • 2017-01-23
    • 2011-11-16
    • 1970-01-01
    • 1970-01-01
    • 2013-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多