版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/dear_Alice_moon/article/details/83347392
先推荐2篇基础的文章: Java 正则表达式 Java正则表达式 匹配中文字符
在实际开发过程中,我需要将类似于这类文字:“本月洗衣粉打75折的吆...”、“方便面可以打折么?”、“皮衣打9折” 中的打折数字提取出来,并转化成对应的小数。 例如,在文字“本月洗衣粉打75折的吆”,需要将75数字提取出来,并转成0.75 。
根据如上描述,正则表达式的需求是: 根据"x折"提取"x折"中的'x',并将'x'转化成小数。
通过下列的2个函数,我实现了该需求。在这里,值得注意的是: 当出现打“7折”时, 将“7”转换成小数 0.7,直接使用 num = Integer.parseInt(“7”)*0.1, 得到的值会出现: 0.7000000000000001 ,出现这类精度偏移的情况,我也很苦恼,不知道是怎么回事,如果有小伙伴知道,还望告知,谢谢。
package com.test.regex;
import java.text.DecimalFormat;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Test4 {
/**
* 通过正则表达式,提取"x折"中的'x',并将 x转成对应的小数。 2018/10/24 10:17
*
*/
public static void main(String[] args) {
Double num = null;
String patternStr = "\\d{0,3}折"; // 正则表达式
Pattern pattern = Pattern.compile(patternStr);
// String content ="我想打个折000啊啊啊"; // Double类型值为:null
String content ="我想打个5折000啊啊啊"; // Double类型值为:0.5
// String content ="我想打个75折000啊啊啊"; // Double类型值为:0.75
// String content ="我想打个123456折000啊啊啊"; // Double类型值为:0.456
Matcher matcher = pattern.matcher(content);
if (matcher.find()) {
int start = matcher.start();
int end = matcher.end();
String subContent = content.substring(start, end-1);
System.out.println("String类型值为:"+subContent);
num = StringToDouble(subContent);
System.out.println("Double类型值为:"+num);
} else {
System.out.println("Double类型值为:"+ "not found @author: dear_Alice_moon");
}
// return num;
}
/**
* 将 String值 转变成 Double小数值 2018/10/24 10:17
* @param content
* @return
*/
public static Double StringToDouble(String content) {
//String content = "3";
Double num = null;
if (content != null && content.length() == 1) {
num = Double.parseDouble(content)*0.1;
System.out.println("格式未控制前,num值为:" + num);
DecimalFormat df = new DecimalFormat("0.0");
String newNum = df.format(num);
num = Double.parseDouble(newNum); // 0.3
} else if (content != null && content.length() == 2) {
num = Double.parseDouble(content)*0.01; // 0.77
} else if (content != null && content.length() == 3) {
num = Double.parseDouble(content)*0.001; // 0.888
}
return num;
}
}
运行结果如下所示: