5 小时以前 9bad721754fe8bbe2e5f459d0706e0fefac569f3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package cn.iocoder.yudao.module.qcreport.engine;
 
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
 
/**
 * JS 值语义。
 * <p>
 * 渲染与规则求值的产物要跟前端逐字一致,而 Java 的默认类型转换和 JS 有几处对不上
 * ({@code String.valueOf(60.0D)} 是 "60.0"、{@code String.valueOf(true)} 是 "true"、
 * 数组 toString 是 "[1, 2]")。凡是拿值当文本用的地方都走这里,别用 Java 的默认转换。
 */
public final class JsValues {
 
    private JsValues() {
    }
 
    /** {@code String(value)}:null 得空串、布尔得 true/false、数组按逗号连接 */
    public static String asText(Object value) {
        if (value == null) {
            return "";
        }
        if (value instanceof Boolean bool) {
            return bool ? "true" : "false";
        }
        if (value instanceof Double || value instanceof Float || value instanceof BigDecimal) {
            return Numbers.toString(((Number) value).doubleValue());
        }
        if (value instanceof Integer || value instanceof Long) {
            return String.valueOf(value);
        }
        if (value instanceof List<?> list) {
            List<String> parts = new ArrayList<>(list.size());
            for (Object element : list) {
                parts.add(element == null ? "" : asText(element));
            }
            return String.join(",", parts);
        }
        return String.valueOf(value);
    }
 
}