format-value.js 4.42 KB
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({});
      },
    });
  });
}