Java 中的貨幣符號匹配
瀏覽人數:14最近更新:
1. 概述
本教學將探討如何在 Java 中配對和驗證貨幣符號。這是處理金融應用程式使用者輸入時的常見需求。
我們可以使用正規表示式進行嚴格驗證來匹配貨幣符號,或使用NumberFormat進行本地化解析。本教學將探討正規表示式和NumberFormat這兩種方法。
2. 使用正規表示式
正規表示式讓我們能夠完全控制要接受的確切格式。讓我們創建一個匹配美元金額的模式:
private static final String DOLLAR_PATTERN = "^\\$\\d+(\\.\\d{1,2})?$";
boolean matchesDollarAmount(String input) {
return Pattern.matches(DOLLAR_PATTERN, input);
}
讓我們來分析一下這種模式:
-
^和$是錨點,用於確保整個字串匹配,而不僅僅是子字串。 -
\\$表示實際的美元符號(我們需要對其進行轉義,因為$在正規表示式中具有特殊意義)。 -
\\d+符合一個或多個數字 -
(\\.\\d{1,2})?選擇性地符合一個小數點後面跟著一個或兩個數字
錨點確保整個字串匹配,拒絕像“ $$$34.00 ”這樣的無效輸入。如果沒有錨點,像\\$\\d+這樣的模式會使用Matcher.find()在「 $$$34.00 」中符合「 $34 」。
讓我們驗證一下我們的模式是否正確:
@Test
void whenValidDollarAmount_thenMatches() {
assertTrue(matchesDollarAmount("$100"));
assertTrue(matchesDollarAmount("$100.00"));
assertTrue(matchesDollarAmount("$10.5"));
assertTrue(matchesDollarAmount("$0"));
assertTrue(matchesDollarAmount("$0.99"));
}
@Test
void whenInvalidDollarAmount_thenDoesNotMatch() {
assertFalse(matchesDollarAmount("$$$34.00"));
assertFalse(matchesDollarAmount("$10."));
assertFalse(matchesDollarAmount("$10.123"));
assertFalse(matchesDollarAmount("100.00"));
assertFalse(matchesDollarAmount("$1,000.00"));
}
對於使用千位分隔符號的金額,我們可以擴展此模式:
private static final String DOLLAR_WITH_COMMAS_PATTERN
= "^\\$\\d{1,3}(,\\d{3})*(\\.\\d{1,2})?$";
boolean matchesDollarAmountWithCommas(String input) {
return Pattern.matches(DOLLAR_WITH_COMMAS_PATTERN, input);
}
此模式現在接受類似「$ 1,000.00 」和「 $1,234,567.89 」這樣的金額:
@Test
void whenDollarAmountWithCommas_thenMatches() {
assertTrue(matchesDollarAmountWithCommas("$1,000.00"));
assertTrue(matchesDollarAmountWithCommas("$1,234,567.89"));
assertTrue(matchesDollarAmountWithCommas("$100"));
assertTrue(matchesDollarAmountWithCommas("$10.5"));
}
正規表示式可以讓我們進行精確控制,但需要針對每種格式變體進行精心的模式設計。
3. 使用 NumberFormat
Java 的NumberFormat類別提供了更簡單的貨幣值解析方法:
Number parseCurrency(String input) {
try {
return NumberFormat.getCurrencyInstance(Locale.US).parse(input);
} catch (ParseException e) {
return null;
}
}
這種方法可以自動處理美元格式,包括貨幣符號和千位分隔符號。我們來測試一下:
@Test
void whenValidCurrencyFormat_thenParses() {
assertNotNull(parseCurrency("$789.11"));
assertNotNull(parseCurrency("$1,234.56"));
assertNotNull(parseCurrency("$0.99"));
}
然而, NumberFormat比較寬鬆,接受部分有效的輸入,例如「$12asdf」。它會從字串的開頭盡可能地解析,並忽略尾隨字元:
@Test
void whenPartiallyValidInput_thenStillParses() {
assertNotNull(parseCurrency("$12asdf"));
assertNotNull(parseCurrency("$100abc"));
}
這種行為是否可以接受,取決於我們的驗證要求。
4. 比較
每種方法都有其優點:
| 方面 | 正規表示式 | 數字格式 |
|---|---|---|
| 驗證嚴格性 | 僅限完全匹配 | 寬鬆,接受部分匹配 |
| 本地化支援 | 每個地區手動設定模式 | 內建區域設定處理 |
| 複雜 | 需要具備模式識別的專業知識 | 簡單 API |
| 靈活性 | 完全控制格式 | 僅限於標準格式 |
正規表示式最適合進行嚴格驗證並提供完全控制,而NumberFormat更適合進行區域設定感知的解析,程式碼也更簡單。
5. 結論
本文探討了 Java 中兩種符合貨幣符號的方法。正規表示式提供嚴格的驗證,並可完全控制可接受的格式,而NumberFormat提供更簡單、更符合本機環境的解析,但代價是比對規則較為寬鬆。
和往常一樣,程式碼可以在GitHub上找到。
本作品係原創或者翻譯,採用《署名-非商業性使用-禁止演繹4.0國際》許可協議