版权声明:可以转载奥 https://blog.csdn.net/Jiajikang_jjk/article/details/83247625
含有小数点的数值字符串进行切割判别数值部分
前言
博主遇到一个业务需求,就是一个参考寿命的属性必须使用INT
型,而客户给的excel表中的参考寿命的数据一列是以年,万小时,小时
,如下图所示:
所以就要对此进行一个处理
思路
- 分类
年,万小时,小时 三种情况 - 判别
进行判断此字符串是否包含有年,万小时,小时 三种情况. - 截取字符串
截取字符串获取数值部分 - 判断是否是数字(包含小数点)
使用正则表达式判断是否函数小数点 - String型转int型
对数值部分(可能含有小数点)做四舍五入或者取整之后String型转int型操作 - 单位换算
最后以小时为单位进行换算处理
流程图分析
代码展示
package ceshi;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class test_String_fenge {
public static void main(String[] args) {
String a = "123万小时";
String b = "45.6小时";
String c = "789年";
String str1 = a.substring(0, a.indexOf("万小时"));
String str2 = b.substring(0, b.indexOf("小时"));
String str3 = c.substring(0, c.indexOf("年"));
System.out.println("\nstr1:" + str1);
System.out.println("\nstr2:" + str2);
System.out.println("\nstr3:" + str3);
String s = "789年";
if (s.contains("万小时")) {
System.out.println("\n包含万小时");
String str22 = s.substring(0, s.indexOf("万小时"));// 获取数字部分
System.out.println("获取数值部分str22:" + str22);
// 使用正则表达式的方式判断是否为数字,包括整数和小数
Pattern pattern1 = Pattern.compile("-?[0-9]+.?[0-9]+");
Matcher isNum1 = pattern1.matcher(str22);
if (!isNum1.matches()) {
System.out.println("不是数字");
// 这里要抛出一个异常提示不是数值
// 或者统计不是数值的行数
} else {
System.out.println("是数字");
// 是数字-------继续判断是否带有小数点
Pattern pattern2 = Pattern.compile("^\\d+$|-\\d+$");// 判断是否为整数
Matcher isNum2 = pattern2.matcher(str22);
if (!isNum2.matches()) {
System.out.println("不是整数");
// 四舍五入取整数
float f = Float.parseFloat(str22);
// 然后四舍五入到整形,只考虑正数了,根据实际需求这里不考虑负数
int number = (int) (f + 0.5) * 10000;// 加0.5就是为了四舍五入,因为强转int会舍弃小数点后边的部分
System.out.println("\n四舍五入取整Int型:" + number);
} else {
System.out.println("是整数");
// 将String型转化为int型
int ii = Integer.parseInt(str22) * 10000; // 万小时转化为小时
System.out.println("\n是整数且为:" + ii);
}
}
} else if (s.contains("小时")) {
System.out.println("\n包含小时");
String str22 = s.substring(0, s.indexOf("小时"));// 获取数字部分
System.out.println("获取数值部分str22:" + str22);
// 使用正则表达式的方式判断是否为数字,包括整数和小数
Pattern pattern1 = Pattern.compile("-?[0-9]+.?[0-9]+");
Matcher isNum1 = pattern1.matcher(str22);
if (!isNum1.matches()) {
System.out.println("不是数字");
// 这里要抛出一个异常提示不是数值
// 或者统计不是数值的行数
} else {
System.out.println("是数字");
// 是数字-------继续判断是否带有小数点
Pattern pattern2 = Pattern.compile("^\\d+$|-\\d+$");// 判断是否为整数
Matcher isNum2 = pattern2.matcher(str22);
if (!isNum2.matches()) {
System.out.println("不是整数");
// 四舍五入取整数
float f = Float.parseFloat(str22);
// 然后四舍五入到整形,只考虑正数了,根据实际需求这里不考虑负数
int number = (int) (f + 0.5);// 加0.5就是为了四舍五入,因为强转int会舍弃小数点后边的部分
System.out.println("\n四舍五入取整Int型:" + number);
} else {
System.out.println("是整数");
// 将String型转化为int型
int ii = Integer.parseInt(str22);
System.out.println("\n是整数且为:" + ii);
}
}
} else if (s.contains("年")) {
System.out.println("\n包含年");
String str22 = s.substring(0, s.indexOf("年"));// 获取数字部分
System.out.println("获取数值部分str22:" + str22);
// 使用正则表达式的方式判断是否为数字,包括整数和小数
Pattern pattern1 = Pattern.compile("-?[0-9]+.?[0-9]+");
Matcher isNum1 = pattern1.matcher(str22);
if (!isNum1.matches()) {
System.out.println("不是数字");
// 这里要抛出一个异常提示不是数值
// 或者统计不是数值的行数
} else {
System.out.println("是数字");
// 是数字-------继续判断是否带有小数点
Pattern pattern2 = Pattern.compile("^\\d+$|-\\d+$");// 判断是否为整数
Matcher isNum2 = pattern2.matcher(str22);
if (!isNum2.matches()) {
System.out.println("不是整数");
// 四舍五入取整数
float f = Float.parseFloat(str22);
// 然后四舍五入到整形,只考虑正数了,根据实际需求这里不考虑负数
int number = (int) (f + 0.5) * 365 * 24;// 加0.5就是为了四舍五入,因为强转int会舍弃小数点后边的部分
System.out.println("\n四舍五入取整Int型:" + number);
} else {
System.out.println("是整数");
// 将String型转化为int型
int ii = Integer.parseInt(str22) * 365 * 24;
System.out.println("\n是整数且为:" + ii);
}
}
} else {
System.out.println("\n都不包含,即为非法数据");
}
}
}
结果
说明
根据博主实际的业务需求,这里没有进行负数的判别。