Как отформатировать число 1000 как & ldquo; 1 000 & rdquo;

Возможно, вы можете сделать поле readonly и отправить submit, чтобы отключить все поля readonly

$(".myform").submit(function(e) {
    $("input[readonly]", this).attr("disabled", true);
});

, а вход (+ script) должен быть

<input type="text" readonly="readonly" name="test" value="test" />

$('input[readonly]').click(function () {
    $(this).removeAttr('readonly');
})
29
задан sawa 23 June 2011 в 21:01
поделиться

12 ответов

см .: http://www.justskins.com/forums/format-number-with-comma-37369.html

нет встроенного пути к нему (если только вы используете Rails, ActiveSupport имеет методы для этого), но вы можете использовать Regex, как

formatted_n = n.to_s.reverse.gsub(/...(?=.)/,'\&,').reverse
36
ответ дан loosecannon 23 June 2011 в 21:01
поделиться

Activesupport использует это регулярное выражение (и нет обратного реверса).

10000000.to_s.gsub(/(\d)(?=(\d\d\d)+(?!\d))/, "\\1 ") #=> "10 000 000"
21
ответ дан steenslag 23 June 2011 в 21:01
поделиться

Вот еще один метод, который довольно чистый и понятный, если вы имеете дело с целыми числами:

number.to_s.reverse.scan(/\d{1,3}/).join(",").reverse

number            #=> 12345678
.to_s             #=> "12345678"
.reverse          #=> "87654321"
.scan(/\d{1,3}/)  #=> ["876","543","21"]
.join(",")        #=> "876,543,21"
.reverse          #=> "12,345,678"

Отлично работает для целых чисел. Конечно, этот конкретный пример будет разделять число запятыми, но переключиться на пробелы или любой другой разделитель так же просто, как заменить параметр в методе join.

9
ответ дан Jeffrey Klein 23 June 2011 в 21:01
поделиться

Официальный документ предлагает три различных способа:

1) Использование lookbehind и lookahead (требуется oniguruma )

12500.to_s.gsub(/(?<=\d)(?=(?:\d{3})+\z)/, ' ')
# => "12 500"

2) Используя только lookahead. Идентичен ответу Стинслага.

3) Не используя ни взгляд, ни взгляд назад

s = 12500.to_s
nil while s.sub!(/(.*\d)(\d{3})/, '\1 \2')
s # => "12 500"
8
ответ дан sawa 23 June 2011 в 21:01
поделиться

Итак, это довольно сумасшедший и хакерский, но он выполняет свою работу ...

12500.to_s.split("").reverse.each_slice(3).map {|y| y.join("").reverse}.reverse.join(" ")
 => "12 500" 

.to_s: convert to string
.split(""): split into separate digits
.reverse: reverse order
.each_slice(3): peel of each three digits (working from back end due to reverse)
.map {|y| y.join("").reverse}: map into an array for each three digits - join back together with no delimiter and reverse order back to original
.reverse: reverse order of mapped array
.join(" "): join mapped array back together with space delimiter
3
ответ дан Yardboy 23 June 2011 в 21:01
поделиться

очень просто:

number_with_delimiter(12500, delimiter: " ")

см .: http://apidock.com/rails/ActionView/Helpers/NumberHelper/number_with_delimiter

4
ответ дан nilid 23 June 2011 в 21:01
поделиться

Другой способ:

12500.to_s.reverse().split(//).inject() {|x,i| (x.gsub(/ /,"").length % 3 == 0 ) ? x + " " + i : x + i}.reverse()

Вы всегда можете открыть класс Fixnum и добавить его для удобства:

module FormatNums
  def spaceify
    self.to_s.reverse().split(//).inject() {|x,i| (x.gsub(/ /,"").length % 3 == 0 ) ? x + " " + i : x + i}.reverse()
  end
end

class Fixnum
  include FormatNums
end

12500.spaceify # => "12 500"
3
ответ дан NullRef 23 June 2011 в 21:01
поделиться

Другой способ: здесь «разделителем является ' ' (пробел), вы можете указать ',' для конвертации денег.»

number.to_s.reverse.gsub(%r{([0-9]{3}(?=([0-9])))}, "\\1#{delimiter}").reverse
1
ответ дан Unihedron 23 June 2011 в 21:01
поделиться

Я только что наткнулся на эту тему, когда искал способ отформатировать значение в валюте США. Я применил несколько иной подход к предлагаемым решениям регулярных выражений:

amt = 1234567890.12
f_amt = format("$%.2f",amt)
i = f_amt.index(".")
while i > 4
  f_amt[i-3]=","+f_amt[i-3]
  i = f_amt.index(",")
end

f_amt
=> "$1,234,567,890.12"

Это может быть параметризовано для форматирования других валют.

0
ответ дан user4240162 23 June 2011 в 21:01
поделиться

Все ответы, кроме одного, используют n.to_s. @ MrMorphe's этого не делает, но он создает массив для редактирования. Вот способ, который не использует ни Fixnum # to_s , ни Array # join .

def separate(n,c=' ')
  m = n
  str = ''
  loop do
    m,r = m.divmod(1000)
    return str.insert(0,"#{r}") if m.zero?
    str.insert(0,"#{c}#{"%03d" % r}")
  end
end

separate(1)       #=>         "1"
separate(12)      #=>        "12"
separate(123)     #=>       "123"
separate(1234)    #=>     "1 234"
separate(12045)   #=>    "12 045"
separate(123456)  #=>   "123 456"
separate(1234000) #=> "1 234 000"

Хммм. Этот столбец справа наклонен?

Другой способ, который использует to_s, но не join:

def separate(n, c=' ')
  str = n.to_s
  sz = str.size
  (3...sz).step(3) { |i| str.insert(sz-i, c) }
  str
end
2
ответ дан Cary Swoveland 23 June 2011 в 21:01
поделиться

Это старый, но самый быстрый и изящный способ, который я смог найти для этого:

def r_delim(s, e)                                                               
  (a = e%1000) > 0 ? r_delim(s, e/1000) : return; s << a                        
end

r_delim([], 1234567).join(',')

Я постараюсь добавить тесты в какой-то момент.

1
ответ дан Mr Morphe 23 June 2011 в 21:01
поделиться

Я знаю, что это старый вопрос, но.

почему бы просто не использовать подстроку подстановки.

в псевдокоде ....

String numberAsString = convertNumberToString(123456);
int numLength = V.length;//determine length of string

String separatedWithSpaces = null;

for(int i=1; i<=numlength; i++){//loop over the number
separatedWithSpaces += numberAsString.getCharacterAtPosition(i);
    if(i.mod(3)){//test to see if i when devided by 3 in an integer modulo,
    separatedWithSpaces += " ";

    }//end if

}//end loop

Я знаю, что это не в каком-то конкретном языке, но, надеюсь, вы поняли идею.

Дэвид

-2
ответ дан DaveM 23 June 2011 в 21:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: