বিপুল সংখ্যায় কমা যোগ করার জন্য কি রেলের ট্রিক আছে?


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
@ মো এটি একটি ভিউ সহায়ক সহায়ক। মডিউলটি অন্তর্ভুক্ত করে আপনার এটি মডিউল থেকে ব্যবহার করতে সক্ষম হওয়া উচিত ActionView::Helpers::NumberHelper
জন টপলি

9
আমি বিশ্বাস করি ডিফল্টরূপে ডিলিমিটারটি কমা হয় তাই আপনাকে এই ক্ষেত্রে সেই বিকল্পটি পাস করার প্রয়োজন হবে না।
ডিকর

3
আপনার ডিলিমিটারটি ছেড়ে দেওয়া উচিত যাতে বর্তমান লোকেল কী ব্যবহার করবেন তা সিদ্ধান্ত নিতে পারে। এটি এমন লোকেলগুলিকে অনুমতি দেয় যা ডিলিমিটারদের জন্য পিরিয়ড ব্যবহার করে যা তারা কয়েক হাজারের মধ্যে দশমিক বিন্দু বিবেচনা করবে putting নীচে কলারডব্লু উত্তর দেখুন।
কাইল হিরোনিমাস

1
4 টি বাক্য গঠন: <% = সংখ্যা_বিহীন_পরিচয় (@ সংখ্যা, যথার্থতা: 0, ডিলিমিটার: ',')%>
কোয়েলটন বি হিগগিনবটম

2
সাবধানতা: number_with_delimiterঅত্যধিক জটিল এবং সত্যিই ধীর, কল স্ট্যাকের বিশাল গভীরতার সাথে। এটি ব্যবহার করে i18nকোনো মানবতা ও extraterrestrial সভ্যতা (হয়তো বা শুধু পারেন পছন্দ করে নিন পরিচিত নম্বর ফরম্যাট পাবে ,বা .এমনকি আপনি যদি যুক্তি যেমন নির্দিষ্ট দশমিক সংখ্যা জন্য)। এটি হাজার হাজার বস্তু বরাদ্দ করে (তাই এর কার্য সম্পাদন নিদর্শনগুলি জটিল এবং প্রোফাইলের পক্ষে শক্ত)। আপনার যদি লোকেলের উপর নির্ভর করে সংখ্যার ফর্ম্যাট করতে বিভিন্ন উপায়ে সমর্থন করার প্রয়োজন না হয় তবে কেবলমাত্র রেগেক্সপগুলি ব্যবহার করে বিবেচনা করুন।
কোলন

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,')। বিপরীত
স্টিফেন নুগেইন

7
অবশ্যই, এটি স্ট্রিংটিকে বিপরীত করে, তারপরে 3 অঙ্কের যে কোনও ক্রম পরে একটি কমা যোগ করে যা অন্য অঙ্কের পরেও অনুসরণ করে, তারপরে ফিরে আসে।
pguardiario

1
@ রেনোসিস - আমি এখন আপনার অর্থ কী তা দেখছি, এটি মুদ্রার ফর্ম্যাট করার জন্য। সুতরাং 2 দশমিক, 7 নয়
পিগার্ডিরিও

2
@pguardiario \\ 1 এর জন্য অতিরিক্ত কী? \1যথেষ্ট না ? ধন্যবাদ।
butterywombat

31

এটি করার সরাসরি উপায়টি , রেলগুলি সহ বা ছাড়াই , হ'ল:

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। এই উত্তরটি আরও অনেকগুলি অগ্রাধিকারের দাবি রাখে।
ইউলিস বিএন


24

আপনি যদি ভিউয়ের বাইরে কমা যোগ করতে চান এবং আপনি কিছু মডিউল অন্তর্ভুক্ত করতে না চান তবে আপনি সংখ্যা_ টু_ডিলিমিটেড পদ্ধতি (রেল সংস্করণ> = 4.02) ব্যবহার করতে পারেন । উদাহরণ স্বরূপ:

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

19

যদি আপনি এটি অনেক কিছু করে থাকেন তবে এফওয়াইআইও কারণ এটি উপরের দ্বারা বোঝানো হয় না, 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

আপনি যদি এটি সর্বাধিক সাধারণ পদ্ধতিতে করেন তবে ডিলিমিটার মান সরবরাহ করার দরকার নেই।


এটির বর্তমান লোকেল ব্যবহারের অতিরিক্ত সুবিধা রয়েছে। আন্তর্জাতিক অ্যাপ্লিকেশনগুলিতে এটি সত্যিই গুরুত্বপূর্ণ কারণ যেহেতু কিছু লোকেল দশমিকের জন্য কমা ব্যবহার করে এবং কয়েক হাজার পৃথককারীকে পিরিয়ড দেয়।
কাইল হিরোনিমাস

16

দশমিকগুলি হ্যান্ডেল করে এমন রেল ব্যবহার না করা তাদের পক্ষে একটি ভাল উপায়:

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

আপনি যদি আলাদা আলাদা সীমানা চান তবে রেজেক্সে সর্বশেষ ',' পরিবর্তন করুন।

বোনাসের জন্য, রিজেেক্স এভাবে কাজ করছে:

  • gsub gsub- এ পাস করা দ্বিতীয় প্যারামিটারের সাথে Regex এর সাথে মেলে এমন সমস্ত কিছু প্রতিস্থাপন করে। এই ক্ষেত্রে যে \\1\\1হয়ে \1যখন মূল্যায়ন যা Regex প্রথম ক্যাপচার গ্রুপ মেলে। এই regex যে হয়(\d)
  • (\d)(?=(\d\d\d)+)3 টি সংখ্যার 1 বা ততোধিক গ্রুপের পরে একটি সংখ্যার সাথে মেলে। পেরেন্সের প্রথম সেটটি হ'ল আমাদের \1ক্যাপচার গ্রুপ, দ্বিতীয়টি হবে \2। যদি আমরা কেবল এটি ছেড়ে যেতাম তবে আমরা পেতাম: 123456.gsub!(/(\d)(?=(\d\d\d)+)/, "\\1,") #=> 1,2,3,456 এটি কারণ 1234 ম্যাচ, 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.tutorialspPoint.com/ruby/ruby_regular_expressions.htm


{{ value | round | replace: "(\d)(?=(\d\d\d)+(?!\d))", "$1," | prepend: "$" }}
মন্ত্রকের

2

আর একটি সমাধান যা সহায়কগুলি ব্যবহার করে না: 2 দশমিক স্থানের সাথে ফর্ম্যাট করুন এবং তারপরে প্রতিস্থাপন করুন। দ্বারা ,

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

1
আমি বিশ্বাস করি যে প্রশ্নটি অঙ্কের গোষ্ঠীকরণের জন্য কমা সম্পর্কিত ছিল , আপনার উত্তরটি অর্জন করে এমন আন্তঃখণ্ডিত অংশ / ভগ্নাংশ অংশ দশমিক বিভাজক হিসাবে কমা নয়। (যেহেতু উইকি লিঙ্কটি ব্যাখ্যা করেছে, দীর্ঘকালীন বিভ্রান্তির কারণে, আন্তঃশাস্ত্রীয় মানদণ্ডগুলি এখন কেবলমাত্র অঙ্কের
গোষ্ঠীকরণের

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 নির্বাচন করে

আমি অনুমান করেছি যে কমাগুলি ১০০ পর্যন্ত ঠিক আছে তবে আপনি যদি একটি দীর্ঘ দীর্ঘ সংখ্যা চান তবে কেবল ১০০ একটি উচ্চতর সংখ্যা তৈরি করুন


0

নতুন বাক্য গঠন

number_with_delimeter(@number, delimeter: ",")

আপনি যদি অর্থের জন্য ব্যবহারকারীকে ডিলিমিটার করতে চান তবে আপনি এটি করতে পারেন

number_to_currency(@number)

$এটিও যুক্ত করবে । আপনি যদি moneyমণি ব্যবহার করেন তবে আপনি এটি করতে পারেন

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

এটিও রাখবে $

number_with_delimiter

রুবি টাকা

number_to_currency



-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.