【问题标题】:Convert input value to currency format when user type用户输入时将输入值转换为货币格式
【发布时间】:2018-11-16 06:17:21
【问题描述】:

我未能将输入值转换为货币格式。我想在用户输入数字时自动添加千位和小数点分隔符 (5,000.00; 125,000.00)。

这是我的代码:

$('input.CurrencyInput').on('blur, focus, keyup',
    function() {
        $(this).val().toLocaleString('en-US', {
            style: 'decimal',
            maximumFractionDigits: 2,
            minimumFractionDigits: 2
        });
    });

【问题讨论】:

  • .val() 返回一个string,但.toLocaleString 是一个number 的方法。
  • 另外,您没有在任何地方设置值。您正在获取当前值并尝试对其进行操作,但没有对结果做任何事情。
  • 您不能使用 oninput 或 keyup 因为您不知道他们打算输入什么。我是否可以输入 1,123,123.123 并将其格式化为 1,123,123.12 或输入 1123123.123(这是一个有效的浮点数)并在我输入时将其格式化为 1,123,123.12?
  • 您可能想看看一些外部库/插件。我过去使用过this one,效果很好。 (点击demo按钮——那里有货币输入)

标签: javascript jquery string number-formatting currency-formatting


【解决方案1】:

您的代码有几个问题:

  1. 您在将多个事件处理程序绑定到输入框时使用了逗号。
  2. 在应用toLocaleString 之前,您没有将收到的值转换为数字。
  3. 您没有在转换后再次设置文本框的值。

更正这些,这是一个工作演示。为简单起见,我删除了除 blur 之外的其他事件处理程序,因为 keyup 引起了问题。

$('input.CurrencyInput').on('blur', function() {
  const value = this.value.replace(/,/g, '');
  this.value = parseFloat(value).toLocaleString('en-US', {
    style: 'decimal',
    maximumFractionDigits: 2,
    minimumFractionDigits: 2
  });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input class="CurrencyInput">

【讨论】:

  • 你试过了吗?
  • @mplungjan -- 是的,您可以运行 sn-p。它可以正确格式化模糊上的数字。
  • 如果我输入1,123,123.123则不会
  • 我们可以等待OP的评论。如果这符合要求,则无需进一步。
  • 我认为这是一个很好的答案,只需让它为重新输入工作,。例如。输入1000,会给你1,000.00..但是现在如果你改变小数点前的最后一个0,你会得到1.00,而不是1,001.00在重新解析之前去掉逗号,就像@TylerRoper说的那样会有所帮助.但是 .replace(/,/g,'') 代替,因为 none 正则表达式只替换第一个 ,.. :)
【解决方案2】:

将值解析为特定的区域设置货币

以下函数将尝试将任何乱码输入值解析为特定货币。
如果您不想强制用户以特定语言环境格式输入值,这很有用。

警告:

由于输入实际上可能像 1,2.3.45,5 一样乱码,但仍然给出有效输出(例如美元:"12,345.50"),因此有一个小而用户友好的警告:

// Example: conversion to HRK (Format: n.nnn,nn)
INPUT: "0.575"   OUTPUT: "0,58"      // smart guessed: decimals
INPUT: "1.575"   OUTPUT: "1.575,00"  // smart guessed: separator

例子:

/**
 * Parse value to currency
 * @param {number|string} input
 * @param {string} locale - Desired locale i.e: "en-US" "hr-HR"
 * @param {string} currency - Currency to use "USD" "EUR" "HRK"  
 * @return {object} 
 */
const parse = (input, locale = "en-US", currency = "USD") => {
  let fmt = String(input)
    .replace(/(?<=\d)[.,](?!\d+$)/g, "")
    .replace(",", ".");
  const pts = fmt.split(".");
  if (pts.length > 1) {
    if (+pts[0] === 0) fmt = pts.join(".");
    else if (pts[1].length === 3) fmt = pts.join("");
  }
  const number = Number(fmt);
  const isValid = isFinite(number);
  const string = number.toFixed(2);
  const intlNFOpts = new Intl.NumberFormat(locale, {
    style: "currency",
    currency: currency,
  }).resolvedOptions();
  const output = number.toLocaleString(locale, {
    ...intlNFOpts,
    style: "decimal",
  });
  return {
    input,
    isValid,
    string,
    number,
    currency,
    output,
  };
};

示例测试:

/**
 * Parse value to currency
 * @param {number|string} input
 * @param {string} locale - Desired locale i.e: "en-US" "hr-HR"
 * @param {string} currency - Currency to use "USD" "EUR" "HRK"  
 * @return {object} 
 */
const parse = (input, locale = "en-US", currency = "USD") => {
  let fmt = String(input)
    .replace(/(?<=\d)[.,](?!\d+$)/g, "")
    .replace(",", ".");
  const pts = fmt.split(".");
  if (pts.length > 1) {
    if (+pts[0] === 0) fmt = pts.join(".");
    else if (pts[1].length === 3) fmt = pts.join("");
  }
  const number = Number(fmt);
  const isValid = isFinite(number);
  const string = number.toFixed(2);
  const intlNFOpts = new Intl.NumberFormat(locale, {
    style: "currency",
    currency: currency,
  }).resolvedOptions();
  const output = number.toLocaleString(locale, {
    ...intlNFOpts,
    style: "decimal",
  });
  return {
    input,
    isValid,
    string,
    number,
    currency,
    output,
  };
};

// TEST:
[
  // Valid values
  "2e5",
  "1,2.3,10,6",
  "0.575",
  "1.575",
  "2.30",
  "1.000.00",
  "1.000",
  1000,
  1,
  ".4",
  "4.",
  "0.25",
  "0.076",
  "1.076",
  0.3478,
  "0.05",
  "123,123",
  "3.000,333.444,009",
  "123,123.80",
  "23.123,80",
  "23.123,8",
  "23.4",
  
  // Invalid values
  null,
  NaN,
  Infinity,
  "a",
].forEach((val) => {
  const p = parse(val, "hr-HR", "HRK");
  console.log(`INP: ${p.input}\t OUT: ${p.output}`);
});
.as-console-wrapper {min-height: 100vh;}

文档:

【讨论】:

    猜你喜欢
    • 2012-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多