JavaScriptでは、与えられた[編集:正の整数] の数字 (1000 億未満) を 3 文字の略語に変換すると、0 から 9 および az/AZ は文字としてカウントされますが、ドット (多くのプロポーショナル フォントでは非常に小さいため) は文字としてカウントされず、文字数制限の観点から無視されることになりますか?
この質問はこの役に立つスレッドですが、同じではありません。たとえば、その関数が「123456 -> 1.23k」(「123.5k」は 5 文字)になるところを、「123456 -> 0.1m」(「0[.]1m」は 3 文字)にする関数を探しています。たとえば、これは期待される関数の出力です(左がオリジナル、右が理想的な戻り値)。
0 "0"
12 "12"
123 "123"
1234 "1.2k"
12345 "12k"
123456 "0.1m"
1234567 "1.2m"
12345678 "12m"
123456789 "0.1b"
1234567899 "1.2b"
12345678999 "12b"
ありがとう!
更新: ありがとうございます! 回答が得られました。次の修正を加えると要件どおりに機能します。
function abbreviateNumber(value) {
var newValue = value;
if (value >= 1000) {
var suffixes = ["", "k", "m", "b","t"];
var suffixNum = Math.floor( (""+value).length/3 );
var shortValue = '';
for (var precision = 2; precision >= 1; precision--) {
shortValue = parseFloat( (suffixNum != 0 ? (value / Math.pow(1000,suffixNum) ) : value).toPrecision(precision));
var dotLessShortValue = (shortValue + '').replace(/[^a-zA-Z 0-9]+/g,'');
if (dotLessShortValue.length <= 2) { break; }
}
if (shortValue % 1 != 0) shortValue = shortValue.toFixed(1);
newValue = shortValue+suffixes[suffixNum];
}
return newValue;
}
ベストアンサー1
アプローチ1: 組み込みライブラリ
Javascriptの組み込みライブラリメソッドを使用することをお勧めします国際数値フォーマット
const formatCash = Intl.NumberFormat('en-US', {
notation: "compact",
maximumFractionDigits: 1
}).format(2500);
console.log(formatCash);
アプローチ2: ライブラリなし
ただし、、、、ループなどのif
複雑さを使用せずに、単純なステートメントでこれらの省略形を作成することもできます。Math
maps
regex
for
K で現金値をフォーマットする
const formatCash = n => {
if (n < 1e3) return n;
if (n >= 1e3) return +(n / 1e3).toFixed(1) + "K";
};
console.log(formatCash(2500));
KMBT で現金価値をフォーマットする
const formatCash = n => {
if (n < 1e3) return n;
if (n >= 1e3 && n < 1e6) return +(n / 1e3).toFixed(1) + "K";
if (n >= 1e6 && n < 1e9) return +(n / 1e6).toFixed(1) + "M";
if (n >= 1e9 && n < 1e12) return +(n / 1e9).toFixed(1) + "B";
if (n >= 1e12) return +(n / 1e12).toFixed(1) + "T";
};
console.log(formatCash(1235000));
負の数の使用
let format = '';
const number = -1235000;
if (number < 0) {
format = '-' + formatCash(-1 * number);
} else {
format = formatCash(number);
}