Stories

Detail Return Return

Python/JS/Go/Java同步學習(第十七篇)四語言“字符串格式化(下)“對照表

🤝 免罵聲明:
  • 本文字符串格式化(下)操作經本蜀黎實戰整理,旨在提供快速參考指南📝
  • 因各語言版本迭代及不同系統環境差異,偶爾可能出現整理不全面之處,實屬正常✅
  • 歡迎理性交流補充,噴子勿噴——畢竟你行你上來寫,我敬你是條漢子,告訴我的你原文鏈接,我給你一鍵三連+轉發👍!
  • 若遇具體問題,請帶圖評論區留言,本蜀黎必拔碼相助🤝
    土味海報17
⚠️【温馨提示·格式化界的"暗雷區"】

別看這兩篇格式化簡單——實則暗藏深坑,字母符號是記憶難點,用錯地方老闆電療,客户不開心!

📚 系列文章預告:
  • 近期內容將聚焦編程基礎構建,以「原創知識矩陣」形式系統梳理核心概念。每篇如連續劇集般環環相扣,建議按順序學習——知識點一鍋端,療效更持久!🔥

🧾【場景還原·小南的科學計數法危機】

📉 小南(抓狂地揮舞審計報告):
  • 鳴人!審計署要求超大金額用科學計數法,庫存編號要補零至6位,還要支持多幣種千分位😱
  • 『3141592653589』要顯示為『3.14e+12』,『1』要變成『000001』——雷影老闆説再搞不定就讓我們手寫全年庫存報表🎰
🦊 鳴人(結印搓出影分身):
  • 「師姐別慌!我這就用toExponential()結印——等等...Go該怎麼用來着?!」
    (影分身砰砰消失)「卡卡西老師!雛田!救命啊——」😵
👁️ 卡卡西(雷切劈開亂碼):
  • 「嘖,又是高級格式化。科學計數法如雷切狂暴輸出,進制轉換如寫輪眼精準控制——雛田,用白眼看看數字結構!」👀
🌸 雛田(柔拳點穴式修復):
🍜鳴人...請、請這樣用:
  • Python用{:e},Java用String.format("%e"),Go用fmt.Printf("%e"),JS用toExponential()...🎨
    還、還有進制轉換像點穴只動數字根基...🎃
⚡ 雷影老闆(電光炸裂):
  • 「🌀三小時內不統一格式——你們就去給雲隱村寫一輩子科學計數法腳本!
🧘【扎馬步·高級格式化心法】
  • {:0>6} → 補零六位(庫存編號強迫症)🔢
  • {:e} → 科學計數法(超大數字優雅變身)🔬
  • {:,.2f} → 千分位+小數(國際金額西裝)💵
  • {:b} → 二進制化身(系統底層溝通)💻
  • padStart(6, '0') → JS補零術(前端仙法)🪄
  • Integer.toBinaryString(12) → Java二進制咆哮(後端剛猛)💥
🧪【四語言實機結印·高級格式化對比】

1. Python(寫輪眼·一念高級格式化)

print("{:0>6}".format(1))        # 000001
print("{:.2e}".format(3141592653589))  # 3.14e+12
print("¥{:,.2f}".format(88888.6666))   # ¥88,888.67
print("{:b}".format(12))         # 1100

2. Java(柔拳·精準點穴)

System.out.printf("%06d", 1);        // 000001
System.out.printf("%.2e", 3141592653589.0);  // 3.14e+12
System.out.printf("¥%,.2f", 88888.6666);     // ¥88,888.67
System.out.printf("%s", Integer.toBinaryString(12)); // 1100

3. Go(雷切·暴力格式化)

fmt.Printf("%06d", 1)          // 000001
fmt.Printf("%.2e", 3141592653589.0)  // 3.14e+12
fmt.Printf("¥%.2f", 88888.6666)     // ¥88888.67
fmt.Printf("%b", 12)           // 1100

4. JS(白眼·動態拼接)

console.log(String(1).padStart(6, '0'));    // 000001
console.log((3141592653589).toExponential(2));  // 3.14e+12
console.log(new Intl.NumberFormat('zh-CN', {style: 'currency', currency: 'CNY'}).format(88888.6666)); // ¥88,888.67
console.log((12).toString(2));         // 1100

📊【四語言高級格式化戰力對比表】

語言 科學計數法 千分位貨幣 進制轉換 實戰指數
Python {:.2e} {:,.2f} {:b} ⭐⭐⭐⭐⭐
Java printf("%.2e") printf("%,.2f") toBinaryString() ⭐⭐⭐⭐
Go fmt.Printf("%.2e") fmt.Printf("%.2f") fmt.Printf("%b") ⭐⭐⭐⭐
JS toExponential(2) Intl.NumberFormat toString(2) ⭐⭐⭐

格式化能力解析

  1. 科學計數法

    • Python/Java/Go 使用 printf 風格格式化(.2e 表示保留2位小數的科學計數)🏆
    • JS 通過 toExponential(2) 方法實現🥈
  2. 千分位貨幣

    • Python/Go 使用 {:,.2f}fmt.Printf("%,.2f") 實現千分位+2位小數🥇
    • Java 通過 printf("%,.2f") 格式化🥈
    • JS 需要使用 Intl.NumberFormat API(功能最強大但語法最複雜)🥉
  3. 進制轉換

    • Python/Java/Go 直接支持二進制轉換({:b} / %b / %b)🏆
    • JS 通過 toString(2) 實現(參數2表示二進制)🥈
  4. 實戰指數

    • ⭐⭐⭐⭐⭐:Python(語法最簡潔統一)🥇
    • ⭐⭐⭐⭐:Java/Go(傳統printf風格,功能完整)🥈
    • ⭐⭐⭐:JS(需要調用特定API,靈活性高但複雜度高)🥉
⚠️【避坑提示·高級格式化界的“十八反”】
  • 🚫 JS的toExponential()會四捨五入 → 科學計數要求精確截斷時爆雷!
  • ✅ 用Math.floor()預處理 → 防指數莫名膨脹🔬
  • 💥 Java的NumberFormat受本地化影響 → 德國用逗號當小數點!
// 危險做法
NumberFormat format = NumberFormat.getInstance(); // 在德國輸出 "88.888,67"
// 安全做法
NumberFormat format = NumberFormat.getInstance(Locale.US); // 永遠輸出 "88,888.67"

🌐 Python的{:e}默認6位小數 → 但財務審計可能要求2位!

print("{:e}".format(3141592653589))  # 3.141593e+12 → 審計署要求3.14e+12!
🧪【實戰融合術·四語言高級格式化】

Python(庫存編號補零)

item_id = 1
print("{:0>6}".format(item_id))  # 000001

Java(科學計數法顯示)

double hugeAmount = 3141592653589.0;
System.out.printf("%.2e", hugeAmount);  // 3.14e+12

Go(二進制轉換)

num := 12
fmt.Printf("%b", num)  // 1100

JS(多幣種格式化)

let amount = 88888.6666;
console.log(new Intl.NumberFormat('en-US', {style: 'currency', currency: 'USD'}).format(amount));  // $88,888.67
🧪【四語言千位符+貨幣完整對照】

Python(六邊形戰士)

# 千位符 + 貨幣符號(完美原生支持)
print("${:,.2f}".format(88888.6666))  # $88,888.67
print("¥{:,.2f}".format(88888.6666))  # ¥88,888.67

Java(需Locales護體)

// 必須顯式指定Locale,否則德國服務器爆炸!
NumberFormat usFormat = NumberFormat.getNumberInstance(Locale.US);
System.out.println("$" + usFormat.format(88888.6666));  // $88,888.67

NumberFormat cnFormat = NumberFormat.getNumberInstance(Locale.US);
System.out.println("¥" + cnFormat.format(88888.6666));  // ¥88,888.67

Go(手動黨狂怒)

// 標準庫無千位符!需要自己造輪子
func formatUSD(amount float64) string {
    parts := strings.Split(fmt.Sprintf("%.2f", amount), ".")
    integerPart := parts[0]
    // 手動添加千位逗號(從後往前每3位插逗號)
    var formatted string
    for i, char := range reverse(integerPart) {
        if i > 0 && i%3 == 0 {
            formatted += ","
        }
        formatted += string(char)
    }
    return "$" + reverse(formatted) + "." + parts[1]
}
fmt.Println(formatUSD(88888.6666))  // $88,888.67

JS(Intl大法好)

// 瀏覽器環境完美支持
console.log(new Intl.NumberFormat('en-US', {
  style: 'currency',
  currency: 'USD'
}).format(88888.6666));  // $88,888.67

console.log(new Intl.NumberFormat('zh-CN', {
  style: 'currency',
  currency: 'CNY'
}).format(88888.6666));  // ¥88,888.67

📊【終極避坑指南表】

語言 核心方案 致命坑點 安全寫法
Python "{:,.2f}".format() 原生安全
Java NumberFormat 默認Locale導致格式意外 顯式指定Locale.US
Go 手動處理/第三方庫 標準庫不支持千位符 golang.org/x/text
JS Intl.NumberFormat Node.js需完整ICU支持 前端安全,Node需檢查環境

避坑要點

  1. Pythonformat語法最友好,無已知陷阱🏆
  2. Java:永遠不要信任默認Locale(如德語區會變成1.000,00格式)🥇
  3. Go:標準庫缺陷,推薦官方擴展庫x/text🥈
  4. JS:瀏覽器環境安全,但Node.js需確保安裝完整ICU數據🥉

安全實踐

  • 跨境業務強制指定Locale🥇
  • 關鍵系統避免依賴運行時環境ICU配置🥈
  • 測試時務必覆蓋多地域場景🥉

🧘【虎山CTO總結】

千位符如「經脈運行」——
  • Python:任督二脈天然通🏆
  • JS:奇經八脈靠Intl🍱
  • Java:需用Locale點穴導氣💎
  • Go:需自行打通經絡📌
以下是本蜀黎整理源碼和截圖⏬
1.Python源碼
# ==================== 財務格式化模塊 ====================
# 金額千分位格式化  # 給數字穿上西裝打領帶 👔
# 日期標準化輸出  # 時間必須西裝革履 ⏰
# 科目編碼補零  # 財務部的強迫症療法 🧮
# ⚠️ERP_冷溪虎山:格式錯誤會導致報表裸奔

print("以下是生成數據編號💰💰💰💰💰💰💰💰💰")
print("{:0>2}".format(1))
print("{:0>3}".format(6))
print("NO.{:0>3}".format(9))

print("\n以下是科學計數法📘📘📘📘📘📘📘📘")
print("{:e}".format(3141592653589))
print("{:0.2e}".format(3141592653589))
print("{:0.2E}".format(3141592653589))
print("{:g}".format(3141592653589))
print("{:G}".format(3141592653589))
print("{:g}".format(314e+1592653589))  #無窮大轉換成inf

print("\n以下是貨幣格式化💸💸💸💸💸💸💸💸💸")
print("${:.2f}".format(88888.6666))
print("¥{:.2f}".format(88888.6666))
print("£{:.2f}".format(88888.6666)) #英鎊
print("€{:.2f}".format(88888.6666)) #歐元

print("\n以下是千位符💸💸💸💸💸💸💸💸💸")
print("${:,.2f}".format(88888.6666))  # $88,888.67 ← 這才是真·千位符+貨幣
print("¥{:,.2f}".format(88888.6666))  # ¥88,888.67

print("\n以下是進制轉換🤑🤑🤑🤑🤑🤑🤑🤑🤑")
print("{:b},{:x},{:X}".format(12,12,12)) #1100,c 二進制和十六進制
print("{:d}".format(0X5A)) #90 十六進制轉換成十進制
print("{:x}".format(0b011101)) #1d 二進制數轉換成十六進制
print("{:b}".format(0O34)) #11100 八進制數轉換成二進制數
    

Python

2.Nodejs源碼
// ==================== 中藥格式化模塊 ====================
// 藥方劑量標準化  // 君臣佐使排排坐 🧘
// 煎法時間格式化  // 文武火候計時器 ⏳
// 藥材編號補位  // 仙草也要身份證 🪪
// ⚠️虎山老藥師:格式不對影響成丹率

// 生成數據編號
console.log("以下是生成數據編號💰💰💰💰💰💰💰💰💰");
console.log(String(1).padStart(2, '0'));
console.log(String(6).padStart(3, '0'));
console.log(`NO.${String(9).padStart(3, '0')}`);

// 科學計數法
console.log("\n以下是科學計數法📘📘📘📘📘📘📘📘");
// 使用科學計數法表示大數字
const bigNum = 3.141592653589e12;
console.log(bigNum.toExponential());
console.log(bigNum.toExponential(2));
console.log(bigNum.toExponential(2).toUpperCase());
console.log(parseFloat(bigNum.toString()).toString());
console.log(parseFloat(bigNum.toString()).toString().toUpperCase());
console.log("inf"); // JS 會自動顯示 Infinity

// 千位符
console.log("\n以下是千位符💸💸💸💸💸💸💸💸💸");
console.log(new Intl.NumberFormat('en-US', {style: 'currency', currency: 'USD'}).format(88888.6666));
console.log(new Intl.NumberFormat('zh-CN', {style: 'currency', currency: 'CNY'}).format(88888.6666));
console.log(new Intl.NumberFormat('en-GB', {style: 'currency', currency: 'GBP'}).format(88888.6666));
console.log(new Intl.NumberFormat('de-DE', {style: 'currency', currency: 'EUR'}).format(88888.6666));

// 進制轉換
console.log("\n以下是進制轉換🤑🤑🤑🤑🤑🤑🤑🤑🤑");
console.log(`${(12).toString(2)},${(12).toString(16)},${(12).toString(16).toUpperCase()}`);
console.log(parseInt("5A", 16).toString(10));
console.log(parseInt("011101", 2).toString(16));
console.log(parseInt("34", 8).toString(2));
 

nodejs

3.Go源碼
package main

import (
    "fmt"
    "math"
    "strings"
)

// ==================== 倉儲格式化模塊 ====================
// 貨號補全至12位  // 強迫症條形碼生成器 🏷️
// 物流單號標準化  // 給快遞發制服 🚛
// 庫存數量對齊  // 讓數字列隊報數 🪖
// ⚠️冷溪物流:格式混亂會導致貨架抑鬱

func main() {
    // 生成數據編號
    fmt.Println("以下是生成數據編號💰💰💰💰💰💰💰💰💰")
    fmt.Printf("%02d\n", 1)
    fmt.Printf("%03d\n", 6)
    fmt.Printf("NO.%03d\n", 9)

    // 科學計數法
    fmt.Println("\n以下是科學計數法📘📘📘📘📘📘📘📘")
    fmt.Printf("%e\n", 3141592653589.0)
    fmt.Printf("%.2e\n", 3141592653589.0)
    fmt.Printf("%.2E\n", 3141592653589.0)
    fmt.Printf("%g\n", 3141592653589.0)
    fmt.Printf("%G\n", 3141592653589.0)
    fmt.Printf("%g\n", math.Inf(1)) // Go 中的無窮大表示

    // 千位符
    fmt.Println("\n以下是貨幣格式化💸💸💸💸💸💸💸💸💸")
    fmt.Printf("$%.2f\n", 88888.6666)
    fmt.Printf("¥%.2f\n", 88888.6666)
    fmt.Printf("£%.2f\n", 88888.6666)
    fmt.Printf("€%.2f\n", 88888.6666)

    fmt.Println("\n以下是千位符💸💸💸💸💸💸💸💸💸三方庫或者手搓")
    //github.com/dustin/go-humanize
    // 標準庫無千位符!需要自己造輪子

    fmt.Println(formatUSD(88888.6666)) // $88,888.67
    // 進制轉換
    fmt.Println("\n以下是進制轉換🤑🤑🤑🤑🤑🤑🤑🤑🤑")
    fmt.Printf("%b,%x,%X\n", 12, 12, 12)
    fmt.Printf("%d\n", 0x5A)
    fmt.Printf("%x\n", 0b011101)
    fmt.Printf("%b\n", 034) // Go 中用 0 開頭表示八進制
}

// 自己實現reverse函數!
func reverse(s string) string {
    runes := []rune(s)
    for i, j := 0, len(runes)-1; i < j; i, j = i+1, j-1 {
        runes[i], runes[j] = runes[j], runes[i]
    }
    return string(runes)
}

// 完整的千位符格式化函數
func formatUSD(amount float64) string {
    parts := strings.Split(fmt.Sprintf("%.2f", amount), ".")
    integerPart := parts[0]

    // 手動反轉→插逗號→再反轉
    reversed := reverse(integerPart)
    var formatted string
    for i, char := range reversed {
        if i > 0 && i%3 == 0 {
            formatted += ","
        }
        formatted += string(char)
    }
    return "$" + reverse(formatted) + "." + parts[1]
}

go

4.Java源碼
import java.text.NumberFormat;
import java.util.Locale;

// ==================== ERP格式化模塊 ====================
// 單據編號補零  // 系統界的處女座 🌟
// 審批流步驟格式化  // 給流程穿職業裝 👔
// 日誌時間標準化  // 時間戳強迫症患者 ⏱️
// ⚠️ERP老兵_冷溪虎山:格式不規範會觸發系統潔癖

class main17 {
    public static void main(String[] args) {
        // 生成數據編號
        System.out.println("以下是生成數據編號💰💰💰💰💰💰💰💰💰");
        System.out.println(String.format("%02d", 1));
        System.out.println(String.format("%03d", 6));
        System.out.println(String.format("NO.%03d", 9));

        // 科學計數法
        System.out.println("\n以下是科學計數法📘📘📘📘📘📘📘📘");
        System.out.println(String.format("%e", 3141592653589.0));
        System.out.println(String.format("%.2e", 3141592653589.0));
        System.out.println(String.format("%.2E", 3141592653589.0));
        System.out.println(String.format("%g", 3141592653589.0));
        System.out.println(String.format("%G", 3141592653589.0));
        System.out.println(String.format("%g", Double.POSITIVE_INFINITY));

        // 千位符
        System.out.println("\n以下是千位符💸💸💸💸💸💸💸💸💸");
        NumberFormat usFormat = NumberFormat.getCurrencyInstance(Locale.US);
        System.out.println(usFormat.format(88888.6666));
        NumberFormat cnFormat = NumberFormat.getCurrencyInstance(Locale.CHINA);
        System.out.println(cnFormat.format(88888.6666));
        NumberFormat ukFormat = NumberFormat.getCurrencyInstance(Locale.UK);
        System.out.println(ukFormat.format(88888.6666));
        NumberFormat deFormat = NumberFormat.getCurrencyInstance(Locale.GERMANY);
        System.out.println(deFormat.format(88888.6666));

        // 進制轉換
        System.out.println("\n以下是進制轉換🤑🤑🤑🤑🤑🤑🤑🤑🤑");
        System.out.println(String.format("%s,%s,%s",
                Integer.toBinaryString(12),
                Integer.toHexString(12),
                Integer.toHexString(12).toUpperCase()));
        System.out.println(Integer.parseInt("5A", 16));
        System.out.println(Integer.toHexString(Integer.parseInt("011101", 2)));
        System.out.println(Integer.toBinaryString(Integer.parseInt("34", 8)));
    }
}
 

Java

源碼分享結束⏫

📜【結局:格式統一·老闆驚歎】

⚡ 雷影老闆(看着整齊的報表目瞪口呆):
  • 🚀這格式...比我的雷遁還高級!
  • 🍜年終獎加十噸《高級格式化忍法帖》+一樂拉麪終身VIP!
🌸 小南(審計報告化作千紙鶴飛散):
  • 「🍜鳴人!下次用{:e}給所有超大數字加『科學變身』——讓審計署再也挑不出刺!」
🦊 鳴人(啃着拉麪嘟囔):
  • 「🙏其實...高級格式化就像煉丹——火候多了糊,少了生,剛剛好才是真忍術!」
🧾【虎山CTO的終極總結】
  • 科學計數法 → 靈芝縮放,舉重若輕(化巨為微)🍄
  • 進制轉換 → 經脈轉換,氣血互通(系統無障礙)🌐
  • 千分位 → 君臣佐使,各守其位(報表如藥方有序)📜
**編程如用藥,切忌胡亂君臣——💊
該科學計數時用靈芝(toExponential),該進制轉換時用經脈(toString(2))**

⚠️ 免責聲明(附因果律警告)

本代碼已注入中醫玄學能量,請謹慎使用:

  • ✅ 允許白嫖,但白嫖不點贊可能導致:

    • 下次面試官恰好問到這個算法
    • 鍵盤自動打出//這裏感謝冷溪虎山CTO
    • 奶茶精準灑在剛寫好的代碼上
  • ✅ 允許商用轉發,但商用不註明出處可能觸發:

    • 系統類型混亂自動轉型
    • 數據庫莫名存儲"君臣佐使"字段
  • ✅ 允許吐槽,但吐槽不帶改進建議可能引發:

    • 終生與老闆N連鞭相愛相殺

🚀 現在立即行動:

  1. 點贊 → 吸收本篇算法精華+怪蜀黎腦洞思維
  2. 收藏 → 避免日後求醫無門
  3. 關注 → 接收更多「中醫+代碼」腦洞
  4. 評論區留言 → 領取你的專屬「算法藥方」

⚠️ 友情提示:

  • 本文內容過於硬核,建議點贊收藏轉發三連,避免小編心情波動導致文章神秘消失
  • 畢竟小編今天可能愛答不理,明天可能高攀不起——
  • 但你的收藏夾,永遠是你最穩的知識備份!

    🐶💻 (小聲説:關我小黑屋?不存在的,備份早已同步GitHub/公眾號/網盤!)
📖Python/JS/Go/Java四語言同步學習,跨語言系列上線(別在糾結學什麼單語言了)

🔍 沒看過前傳?快補課!
1-10篇請移步至"PY-JS-GO-JAVA基礎進階學習系列"合集中閲讀

  • Python/JS/Go/Java同步學習(第十六篇)四語言“字符串格式化(上)“對照表: 財務“小南“紙式格式化術處理憑證內容崩潰(附源碼/截圖/參數表/避坑指南)
  • Python/JS/Go/Java同步學習(第十五篇)四語言“字符串去重“對照表: 財務“小南“紙式去重術處理憑證內容崩潰(附源碼/截圖/參數表/避坑指南)
  • Python/JS/Go/Java同步學習(第十四篇)四語言“字符串字母大小寫轉換“對照表: 財務“小南“紙式轉換術處理憑證內容崩潰(附源碼/截圖/參數表/避坑指南)
  • Python/JS/Go/Java同步學習(第十三篇)四語言“字符串轉碼解碼“對照表: 財務“小南“紙式轉碼術處理憑證亂碼崩潰(附源碼/截圖/參數表/避坑指南)
  • Python/JS/Go/Java同步學習(第十二篇)四語言“字符串填充編號“對照表: 財務“小南“紙式填充術加憑證編號崩潰(附源碼/截圖/參數表/避坑指南)
  • Python/JS/Go/Java同步學習(第十一篇)四語言“字符串替換與填充“對照表: 雷影老闆下達清除“數據歪臉“指令(附源碼/截圖/參數表/避坑指南)
user avatar
0 users favorite the story!

Post Comments

Some HTML is okay.