format-value.js
4.42 KB
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
export function formatValueByGapRule(gapRule, value, gap = ' ', range, isAdd = 1) {
const arr = value ? value.split('') : [];
let showValue = '';
const rule = [];
gapRule.split('|').some((n, j) => {
rule[j] = +n + (rule[j - 1] ? +rule[j - 1] : 0);
});
let j = 0;
arr.some((n, i) => {
// Remove the excess part
if (i > rule[rule.length - 1] - 1) {
return;
}
if (i > 0 && i === rule[j]) {
showValue = showValue + gap + n;
j++;
} else {
showValue = showValue + '' + n;
}
});
let adapt = 0;
rule.some((n, j) => {
if (range === +n + 1 + j) {
adapt = 1 * isAdd;
}
});
range = typeof range !== 'undefined' ? (range === 0 ? 0 : range + adapt) : showValue.length;
return { value: showValue, range: range };
}
export function formatValueByGapStep(step, value, gap = ' ', direction = 'right', range, isAdd = 1, oldValue = '') {
if (value.length === 0) {
return { value, range };
}
const arr = value && value.split('');
let _range = range;
let showValue = '';
if (direction === 'right') {
for (let j = arr.length - 1, k = 0; j >= 0; j--, k++) {
const m = arr[j];
showValue = k > 0 && k % step === 0 ? m + gap + showValue : m + '' + showValue;
}
if (isAdd === 1) {
// 在添加的情况下,如果添加前字符串的长度减去新的字符串的长度为2,说明多了一个间隔符,需要调整range
if (oldValue.length - showValue.length === -2) {
_range = range + 1;
}
} else {
// 在删除情况下,如果删除前字符串的长度减去新的字符串的长度为2,说明少了一个间隔符,需要调整range
if (oldValue.length - showValue.length === 2) {
_range = range - 1;
}
// 删除到最开始,range 保持 0
if (_range <= 0) {
_range = 0;
}
}
} else {
arr.some((n, i) => {
showValue = i > 0 && i % step === 0 ? showValue + gap + n : showValue + '' + n;
});
const adapt = range % (step + 1) === 0 ? 1 * isAdd : 0;
_range = typeof range !== 'undefined' ? (range === 0 ? 0 : range + adapt) : showValue.length;
}
return { value: showValue, range: _range };
}
export function trimValue(value, gap = ' ') {
value = typeof value === 'undefined' ? '' : value;
const reg = new RegExp(gap, 'g');
value = value.toString().replace(reg, '');
return value;
}
function getAddress(geo) {
const { regeocode = {} } = geo || {};
const { addressComponent = {} } = regeocode || {};
const { province, city, district, township, streetNumber } = addressComponent || {};
const { street, number } = streetNumber || {};
const formattedAddress = regeocode.formatted_address || regeocode.formattedAddress || '';
let amapAddress = formattedAddress.replace(province, '');
amapAddress = amapAddress.replace(city, '');
amapAddress = amapAddress.replace(district, '');
amapAddress = amapAddress.replace(township, '');
amapAddress = amapAddress.replace(street, '');
amapAddress = amapAddress.replace(number, '');
return {
formattedAddress,
fullAddress: `${province}${city}${district}${township}${street}${number}`,
address: `${township}${street}${number}${amapAddress}`,
amapAddress,
adcode: addressComponent.adcode,
township,
};
}
export function formatLngLat({ lat, lng }) {
if (!lat || !lng) {
return Promise.resolve({});
}
return new Promise(resolve => {
uni.request({
url: 'https://restapi.amap.com/v3/geocode/regeo', //逆地理编码接口地址。
data: {
key: '1b987a62e5685a58cda5933e1bc66044',
location: lng + ',' + lat,
},
success: response => {
const regeocode = response?.data?.regeocode || {};
const addressComponent = regeocode?.addressComponent || {};
const addressInfo = getAddress(response?.data);
let location = {
lng: lng || '',
lat: lat || '',
provinceCode: addressComponent.adcode ? addressComponent.adcode.substring(0, 2) + '0000' : '',
cityCode: addressComponent.adcode ? addressComponent.adcode.substring(0, 4) + '00' : '',
areaCode: addressComponent.adcode,
provinceName: addressComponent.province,
areaName: addressComponent.district + '',
address: addressInfo.address,
formattedAddress: addressInfo.formattedAddress,
};
resolve(location);
},
fail() {
resolve({});
},
});
});
}