2010-03-09 82 views
1

我有一個java字符串,它有一個美元值和小數點後的美分值,並以+或 - 號開頭。我想轉換成分並將其存儲在一個整數(它可以有+或 - )。還我需要檢查美分部分(小數點後)不超過2個數字,並且如果存在關於Java字符串美元兌美分轉換

例如拋出的錯誤消息: 字符串dollval =「12.23」的輸出值= 1223美分

字符串dollval = 「12」 的輸出值= 1200美分

字符串dollval = 「-0.09」 的輸出值= -9美分

字符串dollval = 「」 -99" 的輸出值= -99美分

字符串dollval =「-99.0」輸出值E = -99美分

字符串dollval = 「-99.23」 的輸出值= -9923美分

字符串dollval = 「0.00」 的輸出值= 0美分

字符串dollval = 「5.2」 輸出VAL = 520美分

字符串dollval = 「5.20」 產值= 520美分

+0

在我以前的帖子中也忘了提及。當我處理像「-0.09」這樣的值時,當我移動到美元整數時,get的丟失。美元有0值,美分有9 – Arav

+2

@arav:你也可以編輯自己的問題來澄清事情。 – trashgod

回答

0

這是一個很好的家庭作業的問題。嘗試對小數進行標記(或分割)。第一個令牌會給你全部的美元。第二部分,便士。如果小數點後只有1個字符,乘以10,使得12.3變成12 * 100 + 3 * 10,而不僅僅是3.如果超過2個標記,則出錯。

你也可以做(int)Float.parseFloat(string)* 100,但是你可能有一些舍入問題。最好留在整數的土地上。

1

您的示例仍然存在主要問題。

字符串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"); 
} 

警告:此代碼可能甚至不進行編譯,更不用說按預期方式工作。當然,實施取決於需求方面......我仍然認爲這是錯誤的。

+0

非常感謝您的時間。我錯過了用戶輸入的下列類型。非常感謝讓我知道「雖然它可以將」99「定義爲99美分,」99.0「定義爲9900美分,但如果用戶輸入」99.1「或」99.10「,則可能會混淆用戶」 「應該是9910美分。 此外,我之前發佈的輸出中存在拼寫錯誤。我正在編輯它現在 – Arav

4

我肯定是不是用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美分

我的代碼假定這是一個錯誤,你的意思是數字無小數部分要幀間以正數和負數作爲全額預付。

+0

同意增加的複雜性是增加維護。我一起工作的一位工程師曾經總結得非常好。當你不能添加更多設計時,設計沒有完成,當你無法帶走任何東西時設計完成。將其儘量減少到最基本的要求,並儘可能強壯和健壯。而是一個比Fancy GUI一直運行的綠色屏幕應用程序,它崩潰了我的座右銘。葉老式可能是,但至少這保證交付。 – Namphibian