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


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.