Возможно, вы можете сделать поле 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');
})
см .: http://www.justskins.com/forums/format-number-with-comma-37369.html
нет встроенного пути к нему (если только вы используете Rails, ActiveSupport имеет методы для этого), но вы можете использовать Regex, как
formatted_n = n.to_s.reverse.gsub(/...(?=.)/,'\&,').reverse
Activesupport использует это регулярное выражение (и нет обратного реверса).
10000000.to_s.gsub(/(\d)(?=(\d\d\d)+(?!\d))/, "\\1 ") #=> "10 000 000"
Вот еще один метод, который довольно чистый и понятный, если вы имеете дело с целыми числами:
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
.
Официальный документ предлагает три различных способа:
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"
Итак, это довольно сумасшедший и хакерский, но он выполняет свою работу ...
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
очень просто:
number_with_delimiter(12500, delimiter: " ")
см .: http://apidock.com/rails/ActionView/Helpers/NumberHelper/number_with_delimiter
Другой способ:
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"
Другой способ: здесь «разделителем является ' '
(пробел), вы можете указать ','
для конвертации денег.»
number.to_s.reverse.gsub(%r{([0-9]{3}(?=([0-9])))}, "\\1#{delimiter}").reverse
Я только что наткнулся на эту тему, когда искал способ отформатировать значение в валюте США. Я применил несколько иной подход к предлагаемым решениям регулярных выражений:
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"
Это может быть параметризовано для форматирования других валют.
Все ответы, кроме одного, используют 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
Это старый, но самый быстрый и изящный способ, который я смог найти для этого:
def r_delim(s, e)
(a = e%1000) > 0 ? r_delim(s, e/1000) : return; s << a
end
r_delim([], 1234567).join(',')
Я постараюсь добавить тесты в какой-то момент.
Я знаю, что это старый вопрос, но.
почему бы просто не использовать подстроку подстановки.
в псевдокоде ....
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
Я знаю, что это не в каком-то конкретном языке, но, надеюсь, вы поняли идею.
Дэвид