关于Java字符串美元到美分的转换

关于Java字符串美元到美分的转换,java,string,Java,String,我有一个java字符串,它在小数点后有一个美元值和一个美分值,并且以+或-符号开始。我想将其转换成美分并存储在整数中(它可以有+或-)。此外,我需要检查美分部分(小数点后)是否不超过2位,如果存在,则抛出错误消息 例如: 字符串dollval=“12.23”输出值=1223美分 字符串dollval=“12”输出值=1200美分 字符串dollval=“-0.09”输出值=-9美分 字符串dollval=“-99”输出值=-99美分 字符串dollval=“-99.0”输出值=-99美分 字符串

我有一个java字符串,它在小数点后有一个美元值和一个美分值,并且以+或-符号开始。我想将其转换成美分并存储在整数中(它可以有+或-)。此外,我需要检查美分部分(小数点后)是否不超过2位,如果存在,则抛出错误消息

例如: 字符串dollval=“12.23”输出值=1223美分

字符串dollval=“12”输出值=1200美分

字符串dollval=“-0.09”输出值=-9美分

字符串dollval=“-99”输出值=-99美分

字符串dollval=“-99.0”输出值=-99美分

字符串dollval=“-99.23”输出值=-9923美分

字符串dollval=“0.00”输出值=0美分

字符串dollval=“5.2”输出值=520美分


String dollval=“5.20”输出值=520美分这是一个很好的家庭作业问题。尝试标记化(或拆分)小数点后。第一个代币会给你全部的美元。第二个部分是便士。如果小数点后只有1个字符,乘以10,那么12.3就变成12*100+3*10,而不仅仅是3。如果超过2个代币,则错误


您也可以使用(int)Float.parseFloat(string)*100,但可能存在一些舍入问题。最好使用整数区域。

这是一个很好的家庭作业问题。尝试标记化(或拆分)小数点后。第一个代币会给你全部的美元。第二个部分是便士。如果小数点后只有1个字符,乘以10,那么12.3就变成12*100+3*10,而不仅仅是3。如果超过2个代币,则错误


您也可以使用(int)Float.parseFloat(string)*100,但可能存在一些舍入问题。最好使用整数区域。

您的示例仍然存在一些主要问题

字符串dollval=“12”输出值=1200美分

字符串dollval=“-99”输出值=-99美分

所以如果一个数字是正的,它就是美元,如果它是负的,它就是美分?这是不合逻辑的

字符串dollval=“-99.0”输出值=-99美分

字符串dollval=“-99.23”输出值=-9923美分

“.”后面的数字实际上意味着什么?在第一个例子中,它们似乎意味着一美分的一小部分。在第二个例子中,它们意味着一美元的一小部分。这是不合逻辑的


话虽如此,我将使用正则表达式实现这一点,将输入拆分为部分,将部分转换为整数,然后根据从示例中推断出的含义重新组合它们。类似如下:

int cents;
Matcher m = Pattern.compile("([-+]?)([0-9]+)(?:\.([0-9]{0,2}))").matcher(input);
if (m.matches()) {
    int sign = m.group(0).equals("-") ? -1 : 1;
    cents = Integer.parseInt(m.group(1));
    if (m.groupCount() == 3) {
        // I'm assuming that "99.1" should mean 9910 cents ...
        int tmp = (m.group(2).length() == 0) ? 0 :
               (m.group(2).length() == 1) ? (Integer.parseInt(m.group(2)) * 10) :
               Integer.parseInt(m.group(2));
        cents = cents * 100 + tmp;
    }
    cents = cents * sign;
} else {
    throw new SomeException("invalid dollars/cents value");
}

警告:此代码甚至可能无法编译,更不用说按预期工作了。当然,实现取决于需求的各个方面……我仍然认为这是错误的。

您的示例仍然存在重大问题

字符串dollval=“12”输出值=1200美分

字符串dollval=“-99”输出值=-99美分

所以如果一个数字是正的,它就是美元,如果它是负的,它就是美分?这是不合逻辑的

字符串dollval=“-99.0”输出值=-99美分

字符串dollval=“-99.23”输出值=-9923美分

“.”后面的数字实际上意味着什么?在第一个例子中,它们似乎意味着一美分的一小部分。在第二个例子中,它们意味着一美元的一小部分。这是不合逻辑的


话虽如此,我将使用正则表达式实现这一点,将输入拆分为部分,将部分转换为整数,然后根据从示例中推断出的含义重新组合它们。类似如下:

int cents;
Matcher m = Pattern.compile("([-+]?)([0-9]+)(?:\.([0-9]{0,2}))").matcher(input);
if (m.matches()) {
    int sign = m.group(0).equals("-") ? -1 : 1;
    cents = Integer.parseInt(m.group(1));
    if (m.groupCount() == 3) {
        // I'm assuming that "99.1" should mean 9910 cents ...
        int tmp = (m.group(2).length() == 0) ? 0 :
               (m.group(2).length() == 1) ? (Integer.parseInt(m.group(2)) * 10) :
               Integer.parseInt(m.group(2));
        cents = cents * 100 + tmp;
    }
    cents = cents * sign;
} else {
    throw new SomeException("invalid dollars/cents value");
}
警告:此代码甚至可能无法编译,更不用说按预期工作了。当然,实现取决于需求的各个方面……我仍然认为这些方面是错误的。

我绝对不会对regexps这样做,因为这会导致不必要的复杂和容易出错的代码。Java标准API提供了一个非常简单的解决方案关于:

    BigDecimal dollars = new BigDecimal(inputString);
    if(dollars.scale()>2)
    {
        throw new IllegalArgumentException();
    }
    int cents = dollars.multiply(new BigDecimal(100)).intValue();
但请注意,您的上述要求并不一致:

字符串dollval=“12”输出值=1200美分

字符串dollval=“-99”输出值=-99美分

我的代码假设这是一个错误,您的意思是没有小数部分的数字对于正数和负数都被解释为整美元。

我绝对不会对regexp这样做,因为这会导致不必要的复杂和容易出错的代码。Java标准API提供了一个非常简单的解决方案:

    BigDecimal dollars = new BigDecimal(inputString);
    if(dollars.scale()>2)
    {
        throw new IllegalArgumentException();
    }
    int cents = dollars.multiply(new BigDecimal(100)).intValue();
但请注意,您的上述要求并不一致:

字符串dollval=“12”输出值=1200美分

字符串dollval=“-99”输出值=-99美分


我的代码假设这是一个错误,您的意思是没有小数部分的数字将被解释为正数和负数的全额。

在我之前的帖子中也忘了提到。当我处理像“-0.09”这样的值时“当我转到美元整数时,符号get丢失了。美元的价值为0,美分的价值为09@arav:你也可以编辑你自己的问题来澄清问题。我之前的帖子也忘了提到。当我处理像“-0.09”这样的值时,当我移动到美元整数时,符号get丢失。美元的价值为0,美分的价值为09@arav:您也可以编辑自己的问题来澄清问题。非常感谢您抽出时间。我错过了用户输入的以下类型。非常感谢您让我知道”虽然您可以将“99”定义为99美分,将“99.0”定义为9900美分,但这可能会让用户感到困惑”如果用户输入“99.1”或“99.10”,那么它应该是9910美分。我之前发布的输出中也有打字错误。我现在正在编辑,非常感谢你的时间。我错过了用户输入的以下类型。非常感谢您让我知道”虽然您可以将“99”定义为99美分,将“99.0”定义为9900美分,但这可能会让用户感到困惑”如果用户输入“99.1”或“99.10”,那么它应该是9910美分。我之前发布的输出中也有打字错误。我现在正在编辑它。增加的复杂性是addin