如何从文本字符串中提取纯数字(例如价格)

作者:袖梨 2026-06-24

本文介绍在 selenium 自动化测试中,如何从带格式的文本(如 "$1,299.99")中精准提取纯数字,并转换为数值类型用于后续计算或比价。

本文介绍在 selenium 自动化测试中,如何从带格式的文本(如 "$1,299.99")中精准提取纯数字,并转换为数值类型用于后续计算或比价。

在使用 Selenium 抓取网页价格(例如 <p class="box-price-present">$1,299.99</p>)时,WebElement.getText() 返回的是原始 DOM 文本——包含货币符号、逗号、小数点甚至空格等非纯数字字符。若需将其用于数值比较、存储或计算,必须先清洗并转换为标准数字类型(如 double 或 int)。

推荐采用正则表达式进行健壮清洗。以下是一个通用且可扩展的工具方法:

public static String extractDigitsAndDot(String input) {    if (input == null || input.trim().isEmpty()) {        return "0";    }    // 保留数字、小数点(.),移除所有其他字符(含 $、,、空格、¥、€ 等)    return input.replaceAll("[^d.]", "");}

⚠️ 注意:该正则 [^d.] 表示“匹配所有非数字且非小数点的字符”,比 [^d.] 更简洁安全(Java 中 d 已涵盖 Unicode 数字,. 在字符类中无需转义)。若需支持千分位逗号后的小数点(如 "1,299.99" → "1299.99"),此逻辑已天然兼容——因为逗号被清除,仅保留数字和小数点。

接着可安全转换为数值类型:

String rawPrice = price.getText(); // e.g., "$1,299.99"String cleanPriceStr = extractDigitsAndDot(rawPrice); // → "1299.99"// 转 double(推荐:保留小数精度,适合价格计算)double numericPrice = Double.parseDouble(cleanPriceStr);// 或转整数(仅当明确需去小数,如单位为“分”时可乘100后转 long)long cents = Math.round(numericPrice * 100); // 避免浮点误差,用于精确金额处理System.out.println("Raw: " + rawPrice);System.out.println("Clean: " + cleanPriceStr);System.out.println("As double: " + numericPrice);System.out.println("Cents: " + cents);

最佳实践建议

  • 始终对 getText() 结果做空/空字符串校验,避免 NullPointerException 或 NumberFormatException;
  • 若价格可能含多个小数点(如 "1.234.56"),需额外逻辑处理(如只保留最后一个点);
  • 对于国际化站点,建议结合 NumberFormat 或 DecimalFormat 解析(需指定 Locale),但正则清洗 + Double.parseDouble 在多数场景下更轻量可靠;
  • 最终入库或比价前,建议统一使用 BigDecimal 处理货币,避免 double 的浮点精度问题(例如 0.1 + 0.2 != 0.3)。

通过以上方法,你即可将任意格式化价格文本("$1,299.99"、"¥2,580"、"€99.95")稳定、高效地转化为可运算的纯数字,无缝接入比价系统或数据分析流程。

相关文章

精彩推荐