问题: js使用Numer()或parse***可能会出现科学计数法?
解决方法: 使用正则表达式匹配字符串
编写正则表达式之前先确定匹配效果:
字符串 | 数字 |
---|---|
000 | 0 |
0100 | 100 |
123 | 123 |
123.1 | 123.1 |
123.1.1 | 123.1 |
123.10 | 123.10 |
-123.10 | 123.10 |
.1 | .1 |
0.1 | 0.1 |
00.1 | 0.1 |
000 | 0 |
001 | 1 |
001.100 | 1.100 |
0 + `其他字符` | 0 |
`空格` + `数字` +`空格` | `数字` |
`其他字符` + `数字` | `数字` |
`数字` + `其他字符` | `数字` |
正则表达式:
/([1-9]*\.\d+)|(0\.\d+)|([1-9]\d*)|(\.\d+)|((?<=0)[1-9]*(?=\D))|(0(?=\D))|(0$)/
js方法:
matchNumberOfString(value) {
return String(value).match(/\s*(([1-9][0-9]*\.\d+)|([1-9]\d*)|(^\.\d+)|(0\.\d+)|([0-9]$))\s*/)[0];
}
spring mvc
问题: Bigdecimal数据从java到向js传输过程中变成了科学计数法?
解决方法: 对相应的Bigdecimal字段使用注解
import com.alibaba.fastjson.annotation.JSONField;
import com.alibaba.fastjson.serializer.ToStringSerializer;
...
@JSONField(serializeUsing = ToStringSerializer.class)
private BigDecimal xxx;
问题: Bigdecimal数据从数据库到java时变成科学计数法?
解决方法:
1.直接调用bigdecimalInstance.toPlainString()
2.使用自定义的字符串序列类
@JSONField(serializeUsing = BigDecimalJsonSerializer.class)
private BigDecimal xxx;
package com.dongbawen.ecology.ffp.serializer;
import com.alibaba.fastjson.serializer.JSONSerializer;
import com.alibaba.fastjson.serializer.ObjectSerializer;
import com.alibaba.fastjson.serializer.SerializeWriter;
import java.io.IOException;
import java.lang.reflect.Type;
import java.math.BigDecimal;
/**
* @author wrz
* @version 1.0.0
* @comment 处理当数值自动转为科学计数法的问题
* @date 2021/02/02
* @copyright xxx有限公司
*/
public class BigDecimalJsonSerializer implements ObjectSerializer {
@Override
public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features) throws IOException {
SerializeWriter out = serializer.out;
if (object == null) {
out.writeNull();
return;
}
BigDecimal number = (BigDecimal) object;
String strVal = number.toPlainString();
out.writeString(strVal);
}
}
问题: postgre数据库数字精度要求较高?
解决方法: 使用numric类型
"frequency" numeric(500,8)
正则表达式工具:
参考文档: