জাভাস্ক্রিপ্ট হাজার বিভাজক / স্ট্রিং ফর্ম্যাট [নকল]


101

সংখ্যা এবং স্ট্রিং বিন্যাসকরণের জন্য জাভাস্ক্রিপ্টে কোনও ফাংশন আছে?

আমি স্ট্রিং বা সংখ্যার জন্য হাজার বিভাজকের জন্য একটি উপায় খুঁজছি ... (স্ট্রিংয়ের মতো। ফরম্যাট সি # তে)



আমি মনে করি আপনি সেখানে যা প্রয়োজন সেখানে পেয়ে যাবেন :) stackoverflow.com/questions/610406/…
জাদ

How to print a number with commas as thousands separators in JavaScript: স্ট্যাকওভারফ্লো.com
অ্যাড্রিয়েন

উত্তর:


172

আপডেট (7 বছর পরে)

নীচের মূল উত্তরে উদ্ধৃত রেফারেন্সটি ভুল ছিল। এটির জন্য একটি বিল্ট ইন ফাংশন রয়েছে, যা কায়সার নীচে পরামর্শ দেয়:toLocaleString

সুতরাং আপনি এটি করতে পারেন:

(1234567.89).toLocaleString('en')              // for numeric input
parseFloat("1234567.89").toLocaleString('en')  // for string input

নীচে বাস্তবায়িত ফাংশনটিও কাজ করে, তবে কেবল এটি প্রয়োজনীয় নয়।

(আমি ভেবেছিলাম সম্ভবত আমি ভাগ্যবান হব এবং এটি 2010 সালে ফিরে আসার দরকার ছিল তবে খুঁজে পাব না। এই আরও নির্ভরযোগ্য উল্লেখ অনুসারে , টোকলস্ট্রিং ECMAScript তৃতীয় সংস্করণ [১৯৯৯] এর পরে থেকে স্ট্যান্ডার্ডের অংশ হয়ে গেছে, আমি বিশ্বাস করি এটি এর অর্থ IE 5.5 হিসাবে অনেকটা পিছনে সমর্থন করা হত))


আসল উত্তর

এই রেফারেন্স অনুসারে কোনও সংখ্যায় কমা যুক্ত করার জন্য কোনও বিল্ট ইন ফাংশন নেই। তবে সেই পৃষ্ঠাটিতে কীভাবে এটি কোডিং করা যায় তার একটি উদাহরণ রয়েছে:

function addCommas(nStr) {
    nStr += '';
    var x = nStr.split('.');
    var x1 = x[0];
    var x2 = x.length > 1 ? '.' + x[1] : '';
    var rgx = /(\d+)(\d{3})/;
    while (rgx.test(x1)) {
            x1 = x1.replace(rgx, '$1' + ',' + '$2');
    }
    return x1 + x2;
}

সম্পাদনা করুন: অন্য পথে যেতে (কমা দিয়ে স্ট্রিংকে সংখ্যায় রূপান্তর করুন), আপনি এর মতো কিছু করতে পারেন:

parseFloat("1,234,567.89".replace(/,/g,''))

4
সত্যই এটির প্রশংসা করুন // তবে আমি কীভাবে সেই স্ট্রিংটিকে (কমা দিয়ে) কোনও সংখ্যায় রূপান্তর করতে পারি?
লস্টলর্ড

এই ফাংশনটি 100,000 এর বেশি সংখ্যার জন্য বিরতি দেয়
DevZer0


বিশুদ্ধ জাভাস্ক্রিপ্ট + + একক Regex সাথে কাজে প্রতিস্থাপন stackoverflow.com/a/44324879/681830
Val,

4
(1234567).toLocaleString().replace(/,/g," ",)হাজারের মধ্যে
ব্যবধানের

123

যদি হাজার হাজার বিভাজক, ডিলিমিটার এবং দশমিক বিভাজককে স্থানীয়করণের বিষয়ে হয় তবে নিম্নলিখিতগুলি সহ যান:

// --> numObj.toLocaleString( [locales [, options] ] )
parseInt( number ).toLocaleString();

আপনি ব্যবহার করতে পারেন এমন বেশ কয়েকটি বিকল্প রয়েছে (এবং ফ্যালব্যাক সহ স্থানীয়ও রয়েছে):

number = 123456.7089;

result  = parseInt( number ).toLocaleString() + "<br>";
result += number.toLocaleString( 'de-DE' ) + "<br>";
result += number.toLocaleString( 'ar-EG' ) + "<br>";
result += number.toLocaleString( 'ja-JP', { 
  style           : 'currency',
  currency        : 'JPY',
  currencyDisplay : 'symbol',
  useGrouping     : true
} ) + "<br>";
result += number.toLocaleString( [ 'jav', 'en' ], { 
  localeMatcher            : 'lookup',
  style                    : 'decimal',
  minimumIntegerDigits     : 2,
  minimumFractionDigits    : 2,
  maximumFractionDigits    : 3,
  minimumSignificantDigits : 2,
  maximumSignificantDigits : 3
} ) + "<br>";

var el = document.getElementById( 'result' );
el.innerHTML = result;
<div id="result"></div>

MDN তথ্য পৃষ্ঠায় বিশদ ।

সম্পাদনা: Commentor সেরেনার মত @I নিম্নলিখিত যোগ করেছেন:

একটি অ-ইংরেজি লোকেল যেখানে আমরা এখনও ইংরেজি বিন্যাস, ব্যবহার চান ব্রাউজার সমর্থন করার জন্য value.toLocaleString('en')। ভাসমান পয়েন্টের জন্যও কাজ করে।


এটি ফ্লোট নাম্বারকে কভার করে না .. আপনি পার্সফ্লোয়েটকে পার্সেন্ট পরিবর্তন করতে পারেন, তবে যদি আপনার ইন্ট = "100,12" (দশমিক বিভাজক হিসাবে কমা) এটি ব্যর্থ হবে। এটি একটি প্রতিস্থাপন (",", "।") দিয়ে স্থির করা যেতে পারে .. তবে "1.000,12" দিয়ে আবার ব্যর্থ হবে। সুতরাং ... আপনি মাঝে মাঝে চাকা পুনরুদ্ধার করা আবশ্যক। stackoverflow.com/a/2901298/1028304
neiker

4
এটি আরও উপযুক্ত হবে:Number(yourNumberOrString).toLocaleString()
জোনাথন

4
একটি অ-ইংরেজি লোকেল যেখানে আমরা এখনও ইংরেজি বিন্যাস, ব্যবহার চান ব্রাউজার সমর্থন করার জন্য value.toLocaleString('en')। ভাসমান পয়েন্টের জন্যও কাজ করে।
ক্লাস ভ্যান আরসেন

4
@ সেরিওগ.লাজিন সাফারি (এবং কোন ওএস এবং কোন সংস্করণে) তে ঠিক কাজ করে না?
কায়সার

4
এফওয়াইআই, ভারতের নম্বর বিন্যাসের মতো 7,77,77,777, ব্যবহার করুনvalue.toLocaleString('en-IN')
মাকেশ

37

ECMAScript2018 পরিবর্তনের সাথে সামঞ্জস্য রেখে লুক-ব্যাক সমর্থন ব্যবহার করে আপডেট হয়েছে।
পিছনের সামঞ্জস্যের জন্য, আসল সমাধানটি দেখতে আরও নীচে স্ক্রোল করুন।

একটি নিয়মিত অভিব্যক্তি ব্যবহার করা যেতে পারে - স্ট্রিং হিসাবে সঞ্চিত বৃহত সংখ্যার সাথে কাজ করার ক্ষেত্রে উল্লেখযোগ্য useful

const format = num => 
    String(num).replace(/(?<!\..*)(\d)(?=(?:\d{3})+(?:\.|$))/g, '$1,')

;[
    format(100),                           // "100"
    format(1000),                          // "1,000"
    format(1e10),                          // "10,000,000,000"  
    format(1000.001001),                   // "1,000.001001"
    format('100000000000000.001001001001') // "100,000,000,000,000.001001001001
]
    .forEach(n => console.log(n))

»ভারবোজ রেজেক্স ব্যাখ্যা (regex101.com) প্রবাহ চিত্র


এই মূল উত্তরটির প্রয়োজন হতে পারে না তবে পিছনের সামঞ্জস্যের জন্য ব্যবহার করা যেতে পারে।

একক নিয়মিত অভিব্যক্তি দিয়ে (কলব্যাক ছাড়াই) এটি হ্যান্ডেল করার চেষ্টা করা আমার বর্তমান সামর্থ্য জাভাস্ক্রিপ্টে নেতিবাচক দৃষ্টিভঙ্গির অভাবের জন্য আমাকে ব্যর্থ করে দেয় ... সবচেয়ে সাধারণ ক্ষেত্রে কাজ করে এমন আরও একটি সংক্ষিপ্ত বিকল্প এখানে কখনও কম নয় - যে কোনও দশমিক পয়েন্টের জন্য অ্যাকাউন্টিং ম্যাচগুলিকে উপেক্ষা করে যেখানে পিরিয়ডের সূচকের পরে ম্যাচের সূচক উপস্থিত হয়।

const format = num => {
    const n = String(num),
          p = n.indexOf('.')
    return n.replace(
        /\d(?=(?:\d{3})+(?:\.|$))/g,
        (m, i) => p < 0 || i < p ? `${m},` : m
    )
}

;[
    format(100),                           // "100"
    format(1000),                          // "1,000"
    format(1e10),                          // "10,000,000,000"  
    format(1000.001001),                   // "1,000.001001"
    format('100000000000000.001001001001') // "100,000,000,000,000.001001001001
]
    .forEach(n => console.log(n))

»ভারবোজ রেজেক্স ব্যাখ্যা (regex101.com)

প্রবাহ চিত্র


এই সিনট্যাক্স চিত্রটি কি regex101.com এ তৈরি করা হয়েছে?
জেরোল্ড ব্রোজার

দশমিক সংখ্যা সহ কী ঘটে?
এমিলিয়ানো

আমি "অবৈধ নিয়মিত অভিব্যক্তি: অবৈধ গোষ্ঠী নির্দিষ্টকরণকারীর নাম" পাচ্ছি। নেটিভ নেটিভ 0.59 এর প্রতিক্রিয়া দেখানো হয়েছে তবে এটি সত্যিই RegEx- এ প্রভাব ফেলবে না।
জোশুয়া পিন্টার

@ জোশুয়াপিন্টার এটি লুকের পিছনে ব্যবহার হবে যা লেখার সময় এখনও সমস্ত প্ল্যাটফর্ম জুড়ে সমর্থিত নয়। আমি অনুমান করছি আপনি বিশেষভাবে আইওএস-এর উল্লেখ করছেন - যেহেতু সাফারি এখনও আমার পক্ষে ব্যর্থ। আপাতত পশ্চাদপটে সামঞ্জস্যপূর্ণ সংস্করণটি ধরে রাখা ভাল। আমি কেবল আমার উত্তরটি ভবিষ্যতের প্রমাণের চেষ্টা করছিলাম। caniuse.com/#search=lookbehind
এমিসারি

4
টিপসটির জন্য এমিসারি ধন্যবাদ হ্যাঁ, এটি প্রতিক্রিয়া নেটিভ 0.59 / এন্ড্রয়েডে রয়েছে, যা জাভাস্ক্রিপ্টকোর (জেএসসি) এর তুলনামূলকভাবে পুরানো সংস্করণ ব্যবহার করে। আমরা নেটিভ 0.60+ প্রতিক্রিয়া আপডেট করার পরে আবার চেষ্টা করব, যার মধ্যে জেএসসিতে একটি আপডেট রয়েছে।
জোশুয়া পিন্টার

11

একটি দুর্দান্ত jQuery নম্বর প্লাগইন রয়েছে: https://github.com/teamdf/jquery-number

এটি আপনাকে দশমিক এবং হাজারের জন্য দশমিক সংখ্যা এবং বিভাজক অক্ষরের বিকল্পগুলির সাথে আপনার পছন্দ মতো ফর্ম্যাটটিতে যে কোনও নম্বর পরিবর্তন করতে দেয়:

$.number(12345.4556, 2);          // -> 12,345.46
$.number(12345.4556, 3, ',', ' ') // -> 12 345,456

আপনি এটি সরাসরি ইনপুট ক্ষেত্রে ব্যবহার করতে পারেন, যা সর্বোত্তম, উপরের মতো একই বিকল্পগুলি ব্যবহার করে:

$("input").number(true, 2);

অথবা আপনি নির্বাচক ব্যবহার করে পুরো ডিওএম উপাদানগুলিতে প্রয়োগ করতে পারেন:

$('span.number').number(true, 2);

সেরা সমাধান ইমো
মিশাল

আমি মনে করি না, প্রায় 800 লাইনের সাথে একটি নতুন ফাইলের প্রয়োজনীয়তা যুক্ত করা, এটি গ্রানডের সাথে একটি পিপিলাকে মেরে ফেলার মতো
এমিলিয়ানো


5
// thousand separates a digit-only string using commas
// by element:  onkeyup = "ThousandSeparate(this)"
// by ID:       onkeyup = "ThousandSeparate('txt1','lbl1')"
function ThousandSeparate()
{
    if (arguments.length == 1)
    {
        var V = arguments[0].value;
        V = V.replace(/,/g,'');
        var R = new RegExp('(-?[0-9]+)([0-9]{3})'); 
        while(R.test(V))
        {
            V = V.replace(R, '$1,$2');
        }
        arguments[0].value = V;
    }
    else  if ( arguments.length == 2)
    {
        var V = document.getElementById(arguments[0]).value;
        var R = new RegExp('(-?[0-9]+)([0-9]{3})'); 
        while(R.test(V))
        {
            V = V.replace(R, '$1,$2');
        }
        document.getElementById(arguments[1]).innerHTML = V;
    }
    else return false;
}   

5
var number = 35002343;

console.log(number.toLocaleString());

রেফারেন্সের জন্য আপনি এখানে চেক করতে পারেন https://developer.mozilla.org/en-US/docs/Web/ জাভা স্ক্রিপ্ট / রেফারেন্স / গ্লোবাল_অবজেক্টস / নাম্বার / টো লোকাল স্ট্রিং


4
hahaha এই var n = 4720 কনসোল.লগ চেষ্টা করুন (n.toLocaleString ()) এটি কাজ করবে না
এমিলিয়ানো

3

আপনি জাভাস্ক্রিপ্ট ব্যবহার করতে পারেন। নীচে acceptকোডগুলি দেওয়া হয়েছে , এটি কেবল সংখ্যাসূচক এবং একটি হবেdot

এখানে জাভাস্ক্রিপ্ট

<script >

            function FormatCurrency(ctrl) {
                //Check if arrow keys are pressed - we want to allow navigation around textbox using arrow keys
                if (event.keyCode == 37 || event.keyCode == 38 || event.keyCode == 39 || event.keyCode == 40) {
                    return;
                }

                var val = ctrl.value;

                val = val.replace(/,/g, "")
                ctrl.value = "";
                val += '';
                x = val.split('.');
                x1 = x[0];
                x2 = x.length > 1 ? '.' + x[1] : '';

                var rgx = /(\d+)(\d{3})/;

                while (rgx.test(x1)) {
                    x1 = x1.replace(rgx, '$1' + ',' + '$2');
                }

                ctrl.value = x1 + x2;
            }

            function CheckNumeric() {
                return event.keyCode >= 48 && event.keyCode <= 57 || event.keyCode == 46;
            }

  </script>

এইচটিএমএল

<input type="text" onkeypress="return CheckNumeric()" onkeyup="FormatCurrency(this)" />

ডেমো জেএসফিডল


2

এই নাম্বার_ফর্ম্যাটটি করার জন্য পিএইচপি.জেসের একটি ফাংশন রয়েছে । আপনি যদি পিএইচপি এর সাথে পরিচিত হন তবে এটি ঠিক একইভাবে কাজ করে


প্রথম লিঙ্কটি পিএইচপি এর সংস্করণ জেএস প্রয়োগের অনুসরণ করে। এটি দরকারী।
o_nix

2
number = 123456.7089;
result = parseInt( number ).toLocaleString() + "<br>";
result = number.toLocaleString( 'pt-BR' ) + "<br>";

var el = document.getElementById( 'result' );
el.innerHTML = result;
<div id="result"></div>

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

নাম্বার বেন্টিন 1000 এবং 9999 দিয়ে চেষ্টা করুন
Emiliano

1

আপনাকে যা করতে হবে প্রয়োজন শুধু সত্যিই হয় এই :

123000.9123.toLocaleString()
//result will be "123,000.912"

দুর্ভাগ্যক্রমে এটি আপনার প্ল্যাটফর্মের উপর নির্ভর করে। কারও কারও কাছে রয়েছে toLocaleString()যা কমা যোগ করে না, বা স্ট্যান্ডার্ডে অন্যান্য বৈশিষ্ট্যগুলির অভাব রয়েছে। toLocaleStringউপস্থিতি যাচাই করা সহজ তবে এর সম্মতি পরীক্ষা করার জন্য নয়।
হিপ্পিট্রেইল

1000 এবং 9999 এর মধ্যে একটি সংখ্যা দিয়ে চেষ্টা করুন
এমিলিয়ানো

0

প্রতিক্রিয়া জন্য সমাধান সংমিশ্রণ

  let converter = Intl.NumberFormat();
  let salary =  monthlySalary.replace(/,/g,'')
  console.log(converter.format(salary))

  this.setState({
    monthlySalary: converter.format(salary)
  })
}

handleOnChangeMonthlySalary(1000)```

0

আপনি এনজিএক্স-ফর্ম্যাট-ফিল্ড ব্যবহার করতে পারেন। ইনপুট মানটি ফর্ম্যাট করার জন্য এটি একটি নির্দেশ যা ভিউতে প্রদর্শিত হবে। এটি ইনপুট মানটি হেরফের করবে না যা ব্যাকএন্ডে সংরক্ষণ করা হবে। এখানে লিঙ্ক দেখুন !

উদাহরণ:

component.html:

<input type="text" formControlName="currency" [appFormatFields]="CURRENCY"
(change)="onChangeCurrency()">

component.ts

onChangeCurrency() {
this.currency.patchValue(this.currency.value);
}

ডেমো দেখতে: এখানে !


0

আপনি নিম্নলিখিত ফাংশন ব্যবহার করতে পারেন:

function format(number, decimals = 2, decimalSeparator = '.', thousandsSeparator = ',') {
  const roundedNumber = number.toFixed(decimals);
  let integerPart = '',
    fractionalPart = '';
  if (decimals == 0) {
    integerPart = roundedNumber;
    decimalSeparator = '';
  } else {
    let numberParts = roundedNumber.split('.');
    integerPart = numberParts[0];
    fractionalPart = numberParts[1];
  }
  integerPart = integerPart.replace(/(\d)(?=(\d{3})+(?!\d))/g, `$1${thousandsSeparator}`);
  return `${integerPart}${decimalSeparator}${fractionalPart}`;
}

// Use Example

let min = 1556454.0001;
let max = 15556982.9999;

console.time('number format');
for (let i = 0; i < 15; i++) {
  let randomNumber = Math.random() * (max - min) + min;
  let formated = format(randomNumber, 4, ',', '.'); // formated number

  console.log('number: ', randomNumber, '; formated: ', formated);
}
console.timeEnd('number format');


এটিকে এত বিভ্রান্ত করবেন না। কেবলমাত্র লোকালস্ট্রিং () ব্যবহার করুন। এ আরো তথ্য developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
সাজাদ Saderi

@ সাজদাদেড়ি আমি লোকলস্ট্রিং () বন্ধুকেও ব্যবহার করি, তবে এই ফাংশনটি আমাকে খুব নমনীয়তা দেয় না, তাই আমাকে আঞ্চলিক সংক্ষিপ্তসারগুলি নিয়ে কাজ করতে হবে না এবং অন্য কেউ এটি ব্যবহার করতে পারে যেহেতু এই ফাংশনটির সংজ্ঞা নম্বর_ফর্মটের সাথে অভিন্ন () পিএইচপি এর ফাংশন।
jin_maxtor

-1

আমি এখানে কোনও উত্তর পছন্দ করি নি, তাই আমি একটি ফাংশন তৈরি করেছি যা আমার পক্ষে কাজ করে। অন্য কারও পক্ষে এটি দরকারী মনে হলে কেবল ভাগ করতে চাই।

function getFormattedCurrency(num) {
    num = num.toFixed(2)
    var cents = (num - Math.floor(num)).toFixed(2);
    return Math.floor(num).toLocaleString() + '.' + cents.split('.')[1];
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.