【问题标题】:How to format number correctly in a calculator app (React)?如何在计算器应用程序(React)中正确格式化数字?
【发布时间】:2021-09-10 00:31:15
【问题描述】:

这是我第一次在 SO 中发帖,我需要帮助我在使用 ReactJS 制作的计算器应用中正确格式化数字。

这是 StackBlitz 上的 link

现在,我想实现在数字被按下并显示在显示器上并添加算术符号后的格式化效果,尤其是在使用多个算术时。

为了说明我的观点,下面是当前显示的示例:

123456 + 7890123 * 11111

而我想要实现的是:

123,456 + 7,890,123 * 11,111

我只能在使用toLocaleString() 函数显示结果时这样做。即使这样,如果我按下数字/数字然后单击结果按钮两次,它会崩溃(因为显示包含逗号,并且评估函数将无法正确处理它)。

希望有人能指出我正确的方向。谢谢。

【问题讨论】:

标签: javascript reactjs mathjs


【解决方案1】:

快速修复

您可以在评估结果之前删除','。 将 Input.js 的第 65 行更改为

setDisplay(evaluate(display.replace(/,/g, '')).toLocaleString());

更好的解决方案

内部逻辑状态外部显示状态保留单独的变量,其中前者对代码有效,后者是其可视化表示。

你可以像这样通过useEffect实现这个

/* --- Display.js --- */
const Display = ({ display }) => {
  const [printValue, setPrintValue] = useState('')
  useEffect(() => {
    setPrintValue(`${display}`.replace(/[0-9]+/g, num => (+num).toLocaleString()))
  }, [display])
  return (
    <StyledDisplay>
      {' '}
      <span>{printValue}</span>{' '}
    </StyledDisplay>
  );
};

另外,在Input.js 中,将handleResult 中的第 65 行更新为

setDisplay(evaluate(display));

【讨论】:

  • 谢谢!!这非常有效!欣赏它 Avinash。
  • @iamkyo 请投票或接受您认为有帮助的答案。这有助于社区。​​span>
【解决方案2】:

对于这种情况,我喜欢使用正则表达式。在这里,您可以使用匹配 3 位数字的正则表达式并根据需要添加逗号。为了简化正则表达式,我通常反转字符串:

const original = "123456 / 98765 * 22222"

function format(str) {
  const reversed = str.split('').reverse().join('')
  const formatted = reversed.replace(/(\d{3})(?=\d)/gm, `$1,`)
  return formatted.split('').reverse().join('')
}
console.log('original string : ', original)
console.log('result string : ',format(original))

你可以在你的 Display 组件中使用这个函数,就在像这样注入 display 属性之前

function format(str){
    const reversed = str.split('').reverse().join('')
    const formatted = reversed.replace(/(\d{3})(?=\d)/gm, `$1,`)
    return formatted.split('').reverse().join('')
}
const Display = ({ display }) => {
  return (
    <StyledDisplay>
      {' '}
      <span>{format(display)}</span>{' '}
    </StyledDisplay>
  );
};

【讨论】:

  • 谢谢,这也很好用!虽然我很好奇需要反转数组,但如果我不使用它会不会工作得很好?
  • 如果您不反转,正则表达式会变得更加复杂,因为您实际上需要确定是否需要分隔符。通过反转,您只需要知道(\d{3})) 组中有多少位数字,以及(?=\d) 组之后是否还有至少一位数字。应该可以不倒车,但我没有搜索太多
  • 我明白了,这很有道理!欣赏解释。
猜你喜欢
  • 2021-09-19
  • 1970-01-01
  • 1970-01-01
  • 2016-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-01
相关资源
最近更新 更多