많은 수의 쉼표를 추가하는 데 유용한 방법이 있습니까?


201

레일에 쉼표가있는 숫자를 인쇄하는 방법이 있습니까?

예를 들어, 숫자가 54000000.34 인 경우 <% = number.function %>을 실행하면 "54,000,000.34"가 출력됩니다.

감사!

답변:


353

number_with_delimiter방법 이 필요합니다 . 예를 들면 다음과 같습니다.

<%= number_with_delimiter(@number, :delimiter => ',') %>

또는이 number_with_precision방법을 사용하여 숫자가 항상 소수점 이하 두 자리로 표시되도록 할 수 있습니다 .

<%= number_with_precision(@number, :precision => 2, :delimiter => ',') %>

5
@Mo 뷰 헬퍼 메소드입니다. 모듈 ActionView::Helpers::NumberHelper내에 포함시켜 모듈에서 사용할 수 있어야합니다 .
John Topley

9
기본적으로 구분 기호는 쉼표라고 생각 하므로이 경우 해당 옵션을 전달할 필요가 없습니다.
Deekor

3
현재 로케일이 사용할 항목을 결정할 수 있도록 분리 문자를 해제해야합니다. 이렇게하면 마침표로 마침표를 사용하는 로케일이 소수로 간주되는 것을 놓지 않고 올바르게 표시 할 수 있습니다. 아래의 coloradoblue 답변을 참조하십시오.
Kyle Heironimus

1
Rails 4 구문 : <% = number_with_precision (@number, precision : 0, delimiter : ',') %>
Choylton B. Higginbottom

2
주의 : number_with_delimiter엄청나게 복잡한 호출 스택으로 인해 지나치게 복잡하고 속도가 느립니다. 그것은 사용 i18n인류와 외계 문명 (또는 어쩌면 그냥 중 하나를 선택할로 알려진 수치를 포맷 할 수 ,또는 .당신이 인수로 지정하는 경우에도, 진수 용). 수천 개의 개체를 할당하므로 성능 패턴이 복잡하고 프로파일 링하기가 어렵습니다. 로케일에 따라 숫자를 형식화하는 다른 방법을 지원할 필요가없는 경우 정규 표현식 사용을 고려하십시오.
kolen December

133

레일을 사용하지 않는 사람 :

number.to_s.reverse.gsub(/(\d{3})(?=\d)/, '\\1,').reverse

2
좋은. 그리고 당신의 대답은 것 같다 미세 (백만 반복 이상의 두 번째의 일부분 만) 빠르게 접근 방식보다 더 제시 여기 :number.to_s.reverse.scan(/(?:\d*\.)?\d{1,3}-?/).join(',').reverse
user664833을

여기서 무슨 일이 일어나고 있는지 설명해 주시겠습니까? number.to_s.reverse.gsub (/ (\ d {3}) (? = \ d) /, '\\ 1,'). reverse
Stephen Nguyen

7
물론 문자열을 뒤집은 다음 3 자리 시퀀스 뒤에 쉼표를 추가하고 그 뒤에 다른 숫자를 넣은 다음 다시 되돌립니다.
pguardiario

1
@renosis-나는 당신이 지금 무엇을 의미하는지 알 것입니다. 그래서 7이 아닌 2 개의 소수.
pguardiario

2
@pguardiario \\ 1에서 여분의 \는 무엇입니까? \1충분 하지 않습니까? 감사.
butterywombat

31

Rails의 유무에 관계없이 이를 수행하는 직접적인 방법은 다음 같습니다.

require 'active_support/core_ext/numeric/conversions'

12345.to_s(:delimited)      # => "12,345"
12345.6789.to_s(:delimited) # => "12,345.6789"

자세한 옵션은 활성 지원 코어 확장-숫자 형식을 참조하십시오 .


1
이 포함 ActiveSupport::NumberHelper.number_to_delimited으로도 사용할 수 있습니다 . 이 답변은 더 많은지지를 받아야합니다.
Ulysse BN


24

뷰 외부에 쉼표를 추가하고 일부 모듈을 포함하지 않으려면 number_to_delimited 메소드를 사용하십시오 (레일 버전> 4.02). 예를 들면 다음과 같습니다.

#inside anywhere
ActiveSupport::NumberHelper.number_to_delimited(1000000) # => "1,000,000"

19

위의 내용에 암시되지 않았기 때문에 많은 일을하지만 FYI를하는 경우 Rails는이 number_with_delimiter방법에 대한 합리적인 기본값을 가지고 있습니다.

#inside controller or view
number_with_delimiter(2444323.4)
#=> 2,444,323.30

#inside console
helper.number_with_delimiter(233423)
#=> 233,423

가장 일반적인 방법으로 구분 기호 값을 제공 할 필요가 없습니다.


현재 로케일을 사용하는 이점이 있습니다. 일부 로케일은 소수점에 쉼표를 사용하고 천 단위 구분 기호에 마침표를 사용하기 때문에 국제 앱에서 매우 중요합니다.
Kyle Heironimus

16

소수를 처리하는 레일을 사용하지 않는 사람들에게 더 좋은 방법은 다음과 같습니다.

parts = number.to_s.split('.')
parts[0].gsub!(/(\d)(?=(\d\d\d)+(?!\d))/, "\\1,")
parts.join('.')

다른 구분 기호를 원하면 정규식에서 마지막 ','을 변경하십시오.

보너스로 다음과 같이 정규 표현식이 작동합니다.

  • gsub는 정규 표현식과 일치하는 모든 것을 gsub에 전달 된 두 번째 매개 변수로 바꿉니다. 이 경우에는입니다 \\1. \\1하게 \1정규식의 첫 번째 캡처 그룹과 일치하는 평가 때. 이 정규식에서 (\d).
  • (\d)(?=(\d\d\d)+)숫자 다음에 하나 이상의 3 자리 그룹을 찾습니다. 첫 번째 세트는 우리의 \1캡처 그룹이고, 두 번째는입니다 \2. 우리가 그것을 그대로두면 우리는 얻을 것입니다 : 123456.gsub!(/(\d)(?=(\d\d\d)+)/, "\\1,") #=> 1,2,3,4561234 개의 일치, 2345 개의 일치 및 3456 개의 일치 때문에 1, 2 및 3 뒤에 쉼표를 넣습니다.
  • (?! \ d)를 추가하면 앞에 오는 숫자 (\d)(?=(\d\d\d)+(?!\d))와 일치 하지 않습니다. 따라서 숫자 다음에 3 자리 숫자 다음에 숫자가 나오지 않습니다. 이것이 작동하는 이유는 gsub가 문자열과 일치하는 것을 계속 대체하기 때문입니다. 첫 번째 일치 만 바꾸려면 123456789와 같은 숫자로 123456,789를 얻습니다. 123456,789는 여전히 정규 표현식과 일치하므로 123,456,789를 얻습니다.

여기 코드가 있습니다 : https://github.com/rails/rails/blob/master/activesupport/lib/active_support/number_helper.rb#L298-L300

그리고 여기 그 정규식에서 무슨 일이 일어나고 있는지 배웠습니다 : http://www.tutorialspoint.com/ruby/ruby_regular_expressions.htm


특히 Liquid template lang에서 매력처럼 작동합니다.{{ value | round | replace: "(\d)(?=(\d\d\d)+(?!\d))", "$1," | prepend: "$" }}
Kukunin

2

도우미를 사용하지 않는 또 다른 솔루션 : 소수점 이하 두 자리로 형식을 지정한 다음을 바꿉니다. 으로

puts(("%.2f" % 2.5666).gsub('.',','))
>> 2,57

1
나는 질문이 숫자 그룹화를 위한 쉼표에 관한 것이지 쉼표가 아니라 당신의 대답이 달성하는 intergral part / fraction part decimal separator 로 쉼표에 관한 것이라고 생각합니다 . (위의 링크는 오랜 혼란으로 인해 인터넷 표준은 이제 숫자 그룹화를위한 공간만을 권장합니다)
Beni Cherniavsky-Paskin

1

당신은 방법을 사용할 수 있습니다 ActiveSupport

예를 들면 다음과 같습니다.

ActiveSupport::NumberHelper::number_to_currency(10000.1234,{precision: 2,unit: ''})


1
  def add_commas(numstring)
    correct_idxs = (1..100).to_a.select{|n| n % 6 == 0}.map{|n| n - 1}
     numstring.reverse.chars.join(",").chars.select.with_index{|x, i| i.even? || correct_idxs.include?(i)}.join.reverse
  end

이것은 루비에 내 길이었다

추가 편집 : 기본적으로 숫자 사이에 모든 쉼표를 추가하고 색인 + 1 % 6 인 쉼표 만 선택합니다

쉼표를 100까지 올릴 수 있다고 생각했지만 슈퍼 긴 숫자를 원하면 100을 더 높은 숫자로 만드십시오.


0

새로운 구문

number_with_delimeter(@number, delimeter: ",")

당신은 돈을 위해 delimeter를 사용하려는 경우 할 수 있습니다

number_to_currency(@number)

이것도 추가 $됩니다. money보석을 사용 한다면 할 수 있습니다

Money.new(@number,"USD").format

이것도 넣을 것 $입니다.

number_with_delimiter

루비 돈

number_to_currency


0

다음은 구분 기호와 정밀도 모두에 대한 트릭을 수행합니다 ( API ref ).

ActiveSupport::NumberHelper.number_to_rounded(1234.532, delimiter: ',', precision: 1) 

(또는 견해 number_to_rounded로는 접미사가 필요하지 않습니다)

HTH


-1

자바 스크립트 사용자를위한

function numberWithDelimiter(value) {
    return (value+"").split("").reverse().join("").replace(/(\d{3})(?=\d)/g, '$1,').split("").reverse().join("")
}

:)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.