Java, 正则表达式之打折问题。

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
	}
	
}

   运行结果如下所示:

猜你喜欢

转载自blog.csdn.net/dear_Alice_moon/article/details/83347392