|
@@ -0,0 +1,55 @@
|
|
|
+package com.winhc.bigdata.udf;
|
|
|
+
|
|
|
+import com.aliyun.odps.udf.UDF;
|
|
|
+import com.aliyun.odps.utils.StringUtils;
|
|
|
+
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.util.regex.Pattern;
|
|
|
+
|
|
|
+/**
|
|
|
+ * @Author: π
|
|
|
+ * @Date: 2020/5/14 16:26
|
|
|
+ * @Description: 字符串去符号
|
|
|
+ */
|
|
|
+public class ToNum extends UDF {
|
|
|
+ private static final Pattern pattern = Pattern.compile("[\\u4e00-\\u9fa5]");
|
|
|
+
|
|
|
+ public Double evaluate(String val,Integer len) {
|
|
|
+ if (StringUtils.isBlank(val)) return null;
|
|
|
+ String num = pattern.matcher(val).replaceAll("");
|
|
|
+ try {
|
|
|
+ return round(num, "1", len);
|
|
|
+ } catch (Exception e) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 进行四舍五入操作 -并保留指定位数
|
|
|
+ *
|
|
|
+ * @param @param d1 处理数据
|
|
|
+ * @param @param d2 如果为1 则自己保留多少位,100为除以100之后的结果再保留位数
|
|
|
+ * @param @param len 小数点保留位数
|
|
|
+ * @param @return 参数
|
|
|
+ * @return String 返回类型
|
|
|
+ * @throws
|
|
|
+ * @Title: round
|
|
|
+ * @Description:
|
|
|
+ */
|
|
|
+ public static double round(String d1, String d2, Integer len) {
|
|
|
+ BigDecimal b1 = new BigDecimal(d1);
|
|
|
+ BigDecimal b2 = new BigDecimal(d2);
|
|
|
+ // 任何一个数字除以1都是原数字
|
|
|
+ // ROUND_HALF_UP是BigDecimal的一个常量,表示进行四舍五入的操作
|
|
|
+ double res = b1.divide(b2, len, BigDecimal.ROUND_HALF_UP).doubleValue();
|
|
|
+ return res;
|
|
|
+ }
|
|
|
+
|
|
|
+ public static void main(String[] args) {
|
|
|
+ ToNum j = new ToNum();
|
|
|
+ System.out.println(j.evaluate("9000.703624001万人民币",6));
|
|
|
+ System.out.println(j.evaluate("0.001000",6));
|
|
|
+ System.out.println(j.evaluate("企业选择不公示",6));
|
|
|
+ System.out.println(j.evaluate("0万元",6));
|
|
|
+ }
|
|
|
+}
|