检查货币是否具有有效符号
check if currency has valid symbol
我有一个表示货币值的字符串,例如 $200、€200、¥200。
根据我的任务,我只支持美元、欧元和日元,不支持其他货币符号。
我想获取字符串的第一个字符并检查它是否是有效的货币符号,这意味着它是欧元或美元或日元而不是其他货币。在 Java 中如何做到这一点?
这是我的示例代码:
char c = s.charAt(0);
if(c == dollar || c == euro || c == yen) { // how can I write the symbols in my code?
valid = true;
} else {
valid = false;
}
这比您想象的要容易:
if(c == '$' || c == '€' || c == '¥')
你说你不想在你的代码中使用“特殊符号”……我不明白你为什么不这样做;但如果需要,您可以将欧元和日元符号分别写为 '\u20AC'
和 '\u00A5'
(但请注意,Java 编译器所做的第一件事是将它们转换回 €
和 ¥
.....)
使用 unicode 符号而不是 \uNNNN
的一个重要原因是可读性:很容易不小心弄错代码,而且不容易发现。而且,假设您要为代码编写测试——您在测试中使用什么来确保它在做正确的事情?如果您使用 \uNNNN
表格,您也会 运行 冒着弄错的风险;如果您在测试中使用该符号,那么您也可以在生产代码中使用该符号。
你可以用 unicode 做到这一点
import java.util.Arrays;
import java.util.List;
// Convert list of Characters to string in Java
class Main
{
public static void main(String[] args)
{ String s="0";
char c = s.charAt(0);
List<Character> currency = Arrays.asList('\u0024', '\u20AC', '\u20AC');
if(currency.contains(c))
System.out.println("true");
}
}
一些模式匹配怎么样?
为字符串验证创建单独的 class。传递要与字符串匹配的 Set
货币符号。在 class 初始化时编译 pattern
(这是繁重的操作,所以最好只执行一次并存储模式本身)。在那种情况下,你会得到这样的模式 ^[$€¥]\d+$
(这意味着 - 字符串的开头 - 方括号中的任何字符(只有一个) - 一个或多个数字 - 字符串的结尾).然后只需将 String
传递给 isValid
方法并匹配模式。如果您需要更改可用货币,只需在 Set
中添加或删除它们(您甚至可以从单独的 .properties 文件中获取它们)。这种方法使您的应用更加灵活。
public class Main{
public static void main(String[] args) {
Set<String> currencySet = Set.of("$", "€", "¥");
CurrencyValidator currencyValidator = new CurrencyValidator(currencySet);
String value = "0";
System.out.println(currencyValidator.isValid(value));
}
}
public class CurrencyValidator {
private final Set<String> currencySet;
private Pattern currencyPattern;
public CurrencyValidator(Set<String> currencySet) {
this.currencySet = currencySet;
init();
}
private void init() {
String currencyString = currencySet.stream()
.collect(Collectors.joining("", "^[", "]\d+$"));
currencyPattern = Pattern.compile(currencyString);
}
public boolean isValid(String value) {
return currencyPattern.matcher(value).matches();
}
}
我有一个表示货币值的字符串,例如 $200、€200、¥200。
根据我的任务,我只支持美元、欧元和日元,不支持其他货币符号。
我想获取字符串的第一个字符并检查它是否是有效的货币符号,这意味着它是欧元或美元或日元而不是其他货币。在 Java 中如何做到这一点?
这是我的示例代码:
char c = s.charAt(0);
if(c == dollar || c == euro || c == yen) { // how can I write the symbols in my code?
valid = true;
} else {
valid = false;
}
这比您想象的要容易:
if(c == '$' || c == '€' || c == '¥')
你说你不想在你的代码中使用“特殊符号”……我不明白你为什么不这样做;但如果需要,您可以将欧元和日元符号分别写为 '\u20AC'
和 '\u00A5'
(但请注意,Java 编译器所做的第一件事是将它们转换回 €
和 ¥
.....)
使用 unicode 符号而不是 \uNNNN
的一个重要原因是可读性:很容易不小心弄错代码,而且不容易发现。而且,假设您要为代码编写测试——您在测试中使用什么来确保它在做正确的事情?如果您使用 \uNNNN
表格,您也会 运行 冒着弄错的风险;如果您在测试中使用该符号,那么您也可以在生产代码中使用该符号。
你可以用 unicode 做到这一点
import java.util.Arrays;
import java.util.List;
// Convert list of Characters to string in Java
class Main
{
public static void main(String[] args)
{ String s="0";
char c = s.charAt(0);
List<Character> currency = Arrays.asList('\u0024', '\u20AC', '\u20AC');
if(currency.contains(c))
System.out.println("true");
}
}
一些模式匹配怎么样?
为字符串验证创建单独的 class。传递要与字符串匹配的 Set
货币符号。在 class 初始化时编译 pattern
(这是繁重的操作,所以最好只执行一次并存储模式本身)。在那种情况下,你会得到这样的模式 ^[$€¥]\d+$
(这意味着 - 字符串的开头 - 方括号中的任何字符(只有一个) - 一个或多个数字 - 字符串的结尾).然后只需将 String
传递给 isValid
方法并匹配模式。如果您需要更改可用货币,只需在 Set
中添加或删除它们(您甚至可以从单独的 .properties 文件中获取它们)。这种方法使您的应用更加灵活。
public class Main{
public static void main(String[] args) {
Set<String> currencySet = Set.of("$", "€", "¥");
CurrencyValidator currencyValidator = new CurrencyValidator(currencySet);
String value = "0";
System.out.println(currencyValidator.isValid(value));
}
}
public class CurrencyValidator {
private final Set<String> currencySet;
private Pattern currencyPattern;
public CurrencyValidator(Set<String> currencySet) {
this.currencySet = currencySet;
init();
}
private void init() {
String currencyString = currencySet.stream()
.collect(Collectors.joining("", "^[", "]\d+$"));
currencyPattern = Pattern.compile(currencyString);
}
public boolean isValid(String value) {
return currencyPattern.matcher(value).matches();
}
}