如何扩展TextField以支持单个小数点及两位小数的货币输入?
实现TextField的货币输入限制
这个需求很常见,我帮你调整一下监听器的逻辑,既能保留数字输入的基础限制,又能支持带两位小数的货币格式:
foodPrice.textProperty().addListener((observable, oldValue, newValue) -> { // 定义合法输入的正则:允许开头0个或多个数字 + 最多1个小数点 + 小数点后最多2位数字 if (!newValue.matches("^\\d*\\.?\\d{0,2}$")) { // 分三步清理非法输入: String cleanedValue = newValue // 第一步:移除所有非数字、非小数点的字符 .replaceAll("[^\\d.]", "") // 第二步:只保留第一个小数点,去掉后续多余的小数点 .replaceAll("(\\.)(.*?)\\.", "$1") // 第三步:如果小数点后超过两位,截断后面的部分 .replaceAll("(\\.\\d{2}).*", "$1"); // 额外处理:如果清理后只剩一个小数点,清空输入(可选,根据你的需求调整) if (cleanedValue.equals(".")) { foodPrice.setText(""); } else { foodPrice.setText(cleanedValue); } } });
逻辑拆解:
- 正则匹配规则
^\d*\.?\d{0,2}$:确保输入的内容要么是纯数字,要么是带一个小数点且小数点后最多两位的格式,比如123、12.3、12.34都是合法的。 - 清理步骤:
- 先过滤掉所有非数字和非小数点的字符,避免字母、符号等非法输入;
- 保证整个输入里最多只有一个小数点,防止用户输入多个
.; - 强制限制小数点后只能有两位数字,超出部分直接截断;
- 最后可选处理纯小数点的情况,避免用户只输入
.这种无意义的内容。
这样调整后,你的TextField就完全符合货币金额的输入需求啦!
内容的提问来源于stack exchange,提问作者methuselah
相关产品推荐
相关产品推荐

