price.ts 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. Component({
  2. externalClasses: ['wr-class', 'symbol-class', 'decimal-class'],
  3. // useStore: [],
  4. properties: {
  5. priceUnit: {
  6. type: String,
  7. value: 'fen',
  8. }, // 价格单位,分 | 元, fen,yuan
  9. price: {
  10. type: String,
  11. optionalTypes: [Number],
  12. value: '',
  13. observer(price) {
  14. this.format(price)
  15. },
  16. }, // 价格, 以分为单位
  17. type: {
  18. type: String,
  19. value: '', //
  20. }, // main 粗体, lighter 细体, mini 黑色, del 中划线, delthrough 中划线,包括货币符号
  21. symbol: {
  22. type: String,
  23. value: '¥', // '¥',
  24. }, // 货币符号,默认是人民币符号¥
  25. fill: Boolean, // 是否自动补齐两位小数
  26. decimalSmaller: Boolean, // 小数字号小一点
  27. lineThroughWidth: {
  28. type: null,
  29. value: '0.12em',
  30. }, // 划线价线条高度
  31. },
  32. data: {
  33. pArr: [] as string[],
  34. },
  35. methods: {
  36. format(price: string | number) {
  37. price = parseFloat(`${price}`)
  38. const pArr = []
  39. if (!isNaN(price)) {
  40. const isMinus = price < 0
  41. if (isMinus) {
  42. price = -price
  43. }
  44. if (this.properties.priceUnit === 'yuan') {
  45. const priceSplit = price.toString().split('.')
  46. pArr[0] = priceSplit[0]
  47. pArr[1] = !priceSplit[1]
  48. ? '00'
  49. : priceSplit[1].length === 1
  50. ? `${priceSplit[1]}0`
  51. : priceSplit[1]
  52. } else {
  53. price = Math.round(price * 10 ** 8) / 10 ** 8 // 恢复精度丢失
  54. price = Math.ceil(price) // 向上取整
  55. pArr[0] = price >= 100 ? `${price}`.slice(0, -2) : '0'
  56. pArr[1] = `${price + 100}`.slice(-2)
  57. }
  58. if (!this.properties.fill) {
  59. // 如果 fill 为 false, 不显示小数末尾的0
  60. if (pArr[1] === '00') pArr[1] = ''
  61. else if (pArr[1][1] === '0') pArr[1] = pArr[1][0]
  62. }
  63. if (isMinus) {
  64. pArr[0] = `-${pArr[0]}`
  65. }
  66. }
  67. this.setData({ pArr })
  68. },
  69. },
  70. })