Форматировать валюту с помощью javascript

сценарий возвращает либо число, например 0,0580, в формате x.xxxx, либо (x) для X оставшихся единиц.

Я хочу отформатировать число 0,0580 и вернуть 5,8 цента или вернуть осталось x единиц.

Есть идеи, как это сделать в javascript? Особенно, как мне отформатировать x.xxxx?

Если первый x не равен 0, я хочу вернуть, например. 1,75$.


person Upvote    schedule 13.01.2011    source источник
comment
Может быть, попробовать написать это самостоятельно, а затем задать конкретный вопрос, если у вас возникли проблемы с этим?   -  person Brian Donovan    schedule 13.01.2011


Ответы (3)


MS написала хороший плагин для jquery. это особенно полезно, если вы занимаетесь локализацией. Попробуй:

http://weblogs.asp.net/scottgu/archive/2010/06/10/jquery-globalization-plugin-from-microsoft.aspx

Я не уверен, что это можно использовать вне jquery...

person ScottE    schedule 13.01.2011

Может быть, я балую вас здесь, но все равно. Вот функция, которую я нашел где-то в какой-то момент и с тех пор перерабатываю. На самом деле я не особо удосужился изучить его, чтобы выяснить, что именно он делает, но это было довольно полезно:

function FormatMoneyAmount(starting_string, ending_string) {
  //check validity of input (true = invalid, false = valid)
  var valid_exp = new RegExp ('[^0-9,.$]', 'gi');
  input_invalid = (typeof(ending_string) == 'undefined' && valid_exp.test(starting_string));

  //check if more than 2 digits follow decimal or no decimal
  decimal_invalid = typeof(ending_string) == 'undefined' && (starting_string.indexOf('.') > -1) && ((starting_string.length - starting_string.indexOf('.')) > 3);

  if (input_invalid || decimal_invalid) {
    ending_string = starting_string;
  } else {
    //remove commas, dollar signs
    var replace_exp = new RegExp ('[,$]', 'gi');
    starting_string = starting_string.replace(replace_exp, '');

    //remove decimal if ending string not set, save for adding on later
    var decimal_substring = '';
    if (typeof(ending_string) == 'undefined' && starting_string.indexOf('.') > -1) {
      decimal_substring = starting_string.substring(starting_string.indexOf('.'), starting_string.length);
      remaining_string = starting_string.substring(0,starting_string.indexOf('.'));
    } else {
      remaining_string = starting_string;
    }

    //if string is already 3 characters or less, do nothing
    if (remaining_string.length > 3) {
      //separate last 3 characters of string from rest of string
      var final_three = remaining_string.substring(remaining_string.length - 3, remaining_string.length);
      remaining_string = remaining_string.substring(0, remaining_string.length - 3);

      //if not first group of 3, add new group before old group with comma, else set to new group
      ending_string = (typeof(ending_string) == 'undefined') ? final_three + ((typeof(decimal_substring) == 'undefined') ? '' : decimal_substring) : final_three + ',' + ending_string;

      //call function again if more than 3 digits remaining to process, else add to end string
      if (remaining_string.length > 3) {
        ending_string = FormatMoneyAmount(remaining_string, ending_string);
      } else {
        ending_string = remaining_string + ',' + ending_string;
      }
    } else {
      ending_string = (typeof(ending_string) == 'undefined') ? remaining_string : remaining_string + ',' + ending_string + ((typeof(decimal_substring) == 'undefined') ? '' : decimal_substring);
    }
  }
  return ending_string;
}
person Hoatzin    schedule 13.01.2011

Первое, что нужно сделать, это проверить формат строки, так как у вас будет два пути кода в зависимости от результата:

if (typeof num = "string" && num.slice(0,1) == "(" && num.slice(-1) == ")") {
    // String is in the format (x), so we just need to return that number
    return num.slice(1,-1) + " units left";
}

Следующая часть — проверить, меньше ли число 1, указав, что это центы, а не целые доллары. Если оно меньше 1, умножив его на 100, вы получите необходимое количество центов:

if (+num < 1)
    // 0.0580 * 100 = 5.8
    return (num * 100) + " cents";
else
    return +num + "$";
person Andy E    schedule 13.01.2011