日韩精品一区二区三区在线视频放-无码中文字幕V?一区二区-成年片免费观看视频-国内少妇人妻丰满av-国产精品中文字幕免费观看-亚洲成人久久一区二区三区-国内少妇偷人精品视频无缓冲-一区二区国产精品日本一区二区三区在线网

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(shí)戰(zhàn)洞察。

React Native鴻蒙跨端開(kāi)發(fā):統(tǒng)一貨幣與百分比格式化工具實(shí)踐

React Native鴻蒙跨端開(kāi)發(fā):統(tǒng)一貨幣與百分比格式化工具實(shí)踐 前陣子在把項(xiàng)目從 Android/iOS 雙端往鴻蒙端遷移時(shí)團(tuán)隊(duì)里吵了三次架核心原因全是“數(shù)字顯示不一致”同一個(gè) 1234567.8iOS 上顯示¥1,234,567.80Android 上顯示¥1,234,567.8同一個(gè) 0.126有的端是 12.6%有的端是 13%。問(wèn)題的根子不是 UI 沒(méi)對(duì)齊而是每個(gè)端各自維護(hù)了一套格式化邏輯格式規(guī)則、舍入策略、空值兜底全不統(tǒng)一。后來(lái)我們借著 React Native 鴻蒙適配的契機(jī)把貨幣格式化formatCurrency和百分比格式化formatPercent兩個(gè)工具函數(shù)徹底收斂到了 JS 層做成了一套跨端共用的核心資產(chǎn)。這篇文章就把當(dāng)時(shí)的完整設(shè)計(jì)思路、實(shí)現(xiàn)代碼、踩坑過(guò)程和測(cè)試方案都放出來(lái)給同樣在搞 React Native 鴻蒙跨端、尤其是金融類應(yīng)用的團(tuán)隊(duì)一個(gè)可以直接參考的樣板。1. 為什么金融應(yīng)用的“數(shù)字顯示”值得專門抽一層工具沉淀很多團(tuán)隊(duì)一開(kāi)始都覺(jué)得格式化不就是toFixed(2)加個(gè)逗號(hào)不值得單獨(dú)做一層。這個(gè)想法在普通工具類 App 里問(wèn)題不大但在金融類應(yīng)用里數(shù)字顯示絕不是 UI 小事它是數(shù)據(jù)正確性的最后一道防線。1.1 金額和百分比出錯(cuò)不是 UI 瑕疵是事故金融應(yīng)用里金額和百分比直接關(guān)聯(lián)到用戶資產(chǎn)、收益、費(fèi)率、還款計(jì)劃等關(guān)鍵信息。一個(gè)¥1,234,567.80如果被格式化成¥1,234,567.8用戶可能覺(jué)得只是顯示風(fēng)格不一致但如果是利率從3.45%被顯示成3.5%用戶會(huì)認(rèn)為平臺(tái)擅自改了他的利率這事直接上升到客訴和合規(guī)層面。更隱蔽的是舍入規(guī)則不一致。同一筆0.005元的利息A 端四舍五入成0.01B 端直接截?cái)喑?.00兩邊對(duì)賬對(duì)不上查半天才發(fā)現(xiàn)是格式化層的差異。這類問(wèn)題在金融項(xiàng)目里就不是“顯示 bug”而是資金對(duì)賬事故。所以把格式化邏輯收斂到一處首要?jiǎng)訖C(jī)是保證跨端行為一致。1.2 多端重復(fù)實(shí)現(xiàn)帶來(lái)的連鎖問(wèn)題在沒(méi)有鴻蒙之前不少金融團(tuán)隊(duì)的現(xiàn)狀是Android 用DecimalFormatiOS 用NumberFormatterWeb 端用Intl.NumberFormat三段代碼各自維護(hù)規(guī)則還經(jīng)常不一樣。Android 的DecimalFormat(#,##0.00)和 iOS 的NumberFormatter在舍入行為上雖然都遵循四舍五入但遇到浮點(diǎn)精度問(wèn)題、負(fù)數(shù)格式括號(hào)還是負(fù)號(hào)、貨幣符號(hào)前后置這些細(xì)節(jié)很容易各搞各的。再加上不同產(chǎn)品經(jīng)理在不同時(shí)期提出不同需求比如 A 端要求-$100.00B 端要求($100.00)兩邊代碼越來(lái)越分叉。鴻蒙端加入之后這個(gè)問(wèn)題被放大了三倍鴻蒙原生用的是 ArkTS格式化能力儲(chǔ)備和生態(tài)成熟度都不如 Android/iOS再寫第四套TextFormatter邏輯維護(hù)成本直接失控。我們當(dāng)時(shí)算過(guò)一筆賬四個(gè)端各自維護(hù)格式化代碼每次格式規(guī)則調(diào)整的排期成本是 4 天而統(tǒng)一到 JS 層后是 1 天。1.3 React Native 鴻蒙架構(gòu)下JS 層是收斂的天然位置選擇把格式化工具收斂到 JS 層不是因?yàn)椤癛eact Native 本來(lái)就是這么寫的”而是因?yàn)檫@個(gè)位置有天然優(yōu)勢(shì)不管最終運(yùn)行在 iOS、Android 還是鴻蒙上RN 的 JS 引擎層都能執(zhí)行同一份代碼。只要團(tuán)隊(duì)約定“所有金額和百分比必須走 formatCurrency / formatPercent 這兩個(gè)函數(shù)”三端行為一致性就由代碼結(jié)構(gòu)保證了而不是靠 Code Review 時(shí)人工提醒。同時(shí)要注意React Native 在鴻蒙上通常跑在 ArkTS 運(yùn)行時(shí)提供的 JS 引擎里比如借助鴻蒙的兼容層方案雖然底層引擎可能不同但如果我們的格式化工具不依賴任何原生能力、不依賴Intl的不穩(wěn)定行為單純用純 JS/TypeScript 實(shí)現(xiàn)就幾乎不受宿主引擎差異影響。這一點(diǎn)在后面第 4 章會(huì)詳細(xì)展開(kāi)。2. formatCurrency把錢顯示對(duì)從理解需求邊界開(kāi)始寫 formatCurrency 之前我建議先別急著寫代碼而是把業(yè)務(wù)需求完整列一遍。貨幣格式化的完整要素遠(yuǎn)不止“四舍五入加逗號(hào)”這么簡(jiǎn)單。2.1 先列清需求再寫代碼貨幣格式化的完整要素一個(gè)健壯的貨幣格式化函數(shù)至少要回答這幾個(gè)問(wèn)題需求維度典型選項(xiàng)說(shuō)明貨幣符號(hào)¥、$、€、?不同市場(chǎng)的默認(rèn)符號(hào)不同符號(hào)位置prefix 前置、suffix 后置如$100.00vs100.00€小數(shù)位數(shù)0、2、3、動(dòng)態(tài)加密貨幣可能到 6 位千分位開(kāi)啟、關(guān)閉部分場(chǎng)景如圖表軸會(huì)關(guān)閉負(fù)數(shù)展示-100.00、-¥100.00、(100.00)會(huì)計(jì)慣例常用括號(hào)舍入方式half-up、floor、ceil金融場(chǎng)景強(qiáng)制要求空值和異常兜底--、0.00、空串接口異常時(shí)必須可讀列完這張表你會(huì)發(fā)現(xiàn)toFixed(2)只是其中一小塊。金融應(yīng)用中真正要命的不是“加不加逗號(hào)”而是負(fù)數(shù)格式和舍入方式這兩個(gè)維度直接關(guān)系到用戶看到的盈虧數(shù)字是否正確。2.2 第一版實(shí)現(xiàn)基于浮點(diǎn)數(shù)的常規(guī)方案第一版我們?yōu)榱丝焖偕暇€寫了一個(gè)基于 number 的常規(guī)實(shí)現(xiàn)。核心思路是輸入金額數(shù)字定義好選項(xiàng)然后做舍入、取絕對(duì)值、拆整數(shù)和小數(shù)、加千分位、拼接符號(hào)。type RoundType half-up | floor | ceil; interface FormatCurrencyOptions { symbol?: string; // 貨幣符號(hào)默認(rèn) ¥ decimalPlaces?: number; // 小數(shù)位默認(rèn) 2 thousandSeparator?: boolean; // 千分位默認(rèn) true symbolPosition?: prefix | suffix; // 符號(hào)位置 negativeFormat?: sign | parenthesis; // 負(fù)數(shù)格式 roundType?: RoundType; // 舍入方式 emptyPlaceholder?: string; // 空值占位 } export function formatCurrency( amount: number | string | null | undefined, options: FormatCurrencyOptions {} ): string { const { symbol ¥, decimalPlaces 2, thousandSeparator true, symbolPosition prefix, negativeFormat sign, roundType half-up, emptyPlaceholder --, } options; if (amount null || amount undefined || amount ) { return emptyPlaceholder; } const num typeof amount string ? parseFloat(amount) : amount; if (isNaN(num) || !isFinite(num)) { return emptyPlaceholder; } const factor Math.pow(10, decimalPlaces); let rounded: number; switch (roundType) { case floor: rounded Math.floor(num * factor) / factor; break; case ceil: rounded Math.ceil(num * factor) / factor; break; default: rounded Math.round(Math.abs(num) * factor) / factor * Math.sign(num); break; } const negative rounded 0; const absValue Math.abs(rounded); const fixedStr absValue.toFixed(decimalPlaces); const [intPart, decimalPart] fixedStr.split(.); const formattedInt thousandSeparator ? intPart.replace(/\B(?(\d{3})(?!\d))/g, ,) : intPart; const decimalStr decimalPart ? .${decimalPart} : ; if (negativeFormat parenthesis negative) { return (${symbol}${formattedInt}${decimalStr}); } const sign negative ? - : ; if (symbolPosition suffix) { return ${sign}${formattedInt}${decimalStr}${symbol}; } return ${sign}${symbol}${formattedInt}${decimalStr}; }這版代碼在絕大多數(shù)場(chǎng)景下都能用但有一個(gè)金融場(chǎng)景繞不開(kāi)的隱患浮點(diǎn)誤差。拿0.1 * 100來(lái)說(shuō)在 JS 里結(jié)果是10.000000000000002如果恰好遇到這種中間值舍入結(jié)果就可能偏移。這類問(wèn)題不常出現(xiàn)但金融應(yīng)用不允許“偶發(fā)錯(cuò)誤”。2.3 精度進(jìn)階整數(shù)分方案與浮點(diǎn)陷阱金融行業(yè)有個(gè)約定俗成的做法涉及金額的內(nèi)部傳輸盡量用“分”為單位用整數(shù)表示從根上避開(kāi)浮點(diǎn)誤差。我們最終在項(xiàng)目里使用的也是這個(gè)方案上游接口直接返回分cents格式化函數(shù)接收整數(shù)分作為主輸入內(nèi)部全部用整數(shù)運(yùn)算。/** * 基于整數(shù)分格式化貨幣避免浮點(diǎn)誤差 * 例如formatCurrencyFromCents(12345678) ¥123,456.78 */ export function formatCurrencyFromCents( cents: number | string | null | undefined, options: FormatCurrencyOptions {} ): string { const { symbol ¥, decimalPlaces 2, thousandSeparator true, symbolPosition prefix, negativeFormat sign, roundType half-up, emptyPlaceholder --, } options; if (cents null || cents undefined || cents ) { return emptyPlaceholder; } let centsNum typeof cents string ? parseInt(cents, 10) : cents; if (isNaN(centsNum) || !isFinite(centsNum)) { return emptyPlaceholder; } const negative centsNum 0; const absCents Math.abs(centsNum); let intPart: string; let decimalPart: string; if (decimalPlaces 0) { const rounded roundCents(absCents, 0, roundType); intPart String(rounded); decimalPart ; } else { const scale Math.pow(10, decimalPlaces - 2); let scaled: number; if (decimalPlaces 2) { // 例如只需要 1 位小數(shù)先把分轉(zhuǎn)成角再舍入 scaled Math.floor(absCents / 10); if (roundType half-up) { scaled Math.round(absCents / 10); } else if (roundType ceil) { scaled Math.ceil(absCents / 10); } } else { // 常見(jiàn)場(chǎng)景整數(shù)分直接拆成元和分 // 更多位小數(shù)時(shí)用 scale 放大處理 scaled roundCents(absCents, decimalPlaces, roundType); } intPart String(Math.floor(scaled / Math.pow(10, decimalPlaces))); const rawDecimal String(scaled % Math.pow(10, decimalPlaces)).padStart(decimalPlaces, 0); decimalPart rawDecimal; } const formattedInt thousandSeparator ? intPart.replace(/\B(?(\d{3})(?!\d))/g, ,) : intPart; const decimalStr decimalPart ? .${decimalPart} : ; const body symbolPosition suffix ? ${formattedInt}${decimalStr}${symbol} : ${symbol}${formattedInt}${decimalStr}; if (negativeFormat parenthesis negative) { return (${body}); } return ${negative ? - : }${body}; } function roundCents(absCents: number, decimalPlaces: number, roundType: RoundType): number { const scale Math.pow(10, decimalPlaces - 2); const target absCents / scale; switch (roundType) { case floor: return Math.floor(target); case ceil: return Math.ceil(target); default: return Math.round(target); } }核心區(qū)別在于整個(gè)格式化過(guò)程不出現(xiàn)浮點(diǎn)數(shù)乘除12345678分直接拆成123456元和78分千分位也是打在整數(shù)字符串上完全不依賴toFixed。這樣就徹底規(guī)避了0.1 0.2這類經(jīng)典問(wèn)題。但實(shí)際業(yè)務(wù)中并不是所有上游都返回分有些接口返回的是“元”且是浮點(diǎn)數(shù)。這種場(chǎng)景我們不直接在格式化層修浮點(diǎn)而是先提供一個(gè)yuanToCents轉(zhuǎn)換函數(shù)在數(shù)據(jù)進(jìn)入業(yè)務(wù)層時(shí)就完成轉(zhuǎn)換/** 元轉(zhuǎn)分在數(shù)據(jù)入口統(tǒng)一轉(zhuǎn)換后續(xù)所有金額展示都走整數(shù)分 */ export function yuanToCents(yuan: number | string): number { const num typeof yuan string ? parseFloat(yuan) : yuan; if (isNaN(num) || !isFinite(num)) { return 0; } return Math.round((num Number.EPSILON) * 100); }這里用Number.EPSILON也是為了抵消部分浮點(diǎn)噪聲。建議團(tuán)隊(duì)定一條硬性規(guī)范數(shù)據(jù)層拿到金額后立刻轉(zhuǎn)成整數(shù)分業(yè)務(wù)層和展示層只認(rèn)分。3. formatPercent比貨幣格式化更隱蔽的“單位刺客”百分比格式化比貨幣格式化更容易踩坑因?yàn)樗妮斎胝Z(yǔ)義經(jīng)常不統(tǒng)一。同樣是利率0.126有的接口直接傳0.126讓你自己乘 100有的接口直接傳12.6表示已經(jīng)是百分比數(shù)值。如果不做統(tǒng)一約定格式化函數(shù)輸出就亂套。3.1 百分比輸入到底是 0.1234 還是 12.34必須顯式約定我見(jiàn)過(guò)很多團(tuán)隊(duì)在這個(gè)問(wèn)題上互相甩鍋業(yè)務(wù)組說(shuō)“后端返回的就是 0.1234 嘛”后端說(shuō)“我們文檔寫的是百分比數(shù)值 12.34”最后前端在展示層臨時(shí)除以 100 或者乘以 100一個(gè)端一個(gè)樣子。formatPercent 的第一個(gè)設(shè)計(jì)決策就是輸入統(tǒng)一按“原始比例”處理也就是 0.1234 表示 12.34%。這樣和國(guó)際化慣例一致后端存的是什么單位不會(huì)影響前端展示。但為了避免以后被“傳 12.34 的接口”坑到我提供了valueToPercent的擴(kuò)展參數(shù)如果你的上游字段穩(wěn)定地傳入已經(jīng)放大 100 倍的值可以顯式聲明inputScaled: true讓函數(shù)內(nèi)部不再乘 100。這個(gè)參數(shù)一旦設(shè)置代碼里就必須寫清楚不能猜。3.2 百分比格式化實(shí)現(xiàn)interface FormatPercentOptions { decimalPlaces?: number; // 小數(shù)位默認(rèn) 2 thousandSeparator?: boolean; // 千分位默認(rèn) true withSign?: boolean; // 是否顯示正號(hào)如 3.45% allowNegative?: boolean; // 是否允許負(fù)數(shù) inputScaled?: boolean; // 輸入是否已是百分比數(shù)值如 12.6 表示 12.6% trimTrailingZeros?: boolean; // 是否去掉小數(shù)末尾的 0 emptyPlaceholder?: string; } export function formatPercent( value: number | string | null | undefined, options: FormatPercentOptions {} ): string { const { decimalPlaces 2, thousandSeparator true, withSign false, allowNegative true, inputScaled false, trimTrailingZeros false, emptyPlaceholder --, } options; if (value null || value undefined || value ) { return emptyPlaceholder; } const num typeof value string ? parseFloat(value) : value; if (isNaN(num) || !isFinite(num)) { return emptyPlaceholder; } const raw inputScaled ? num : num * 100; const negative raw 0; const absRaw Math.abs(raw); const factor Math.pow(10, decimalPlaces); let rounded Math.round((absRaw Number.EPSILON) * factor) / factor; let [intPart, decimalPart] rounded.toFixed(decimalPlaces).split(.); decimalPart decimalPart || ; if (trimTrailingZeros decimalPlaces 0) { decimalPart decimalPart.replace(/0$/, ); } const formattedInt thousandSeparator ? intPart.replace(/\B(?(\d{3})(?!\d))/g, ,) : intPart; const decimalStr decimalPart ? .${decimalPart} : ; let sign ; if (negative) { if (!allowNegative) { return emptyPlaceholder; } sign -; } else if (withSign) { sign ; } return ${sign}${formattedInt}${decimalStr}%; }使用示例formatPercent(0.126) // 12.6% formatPercent(0.126, { decimalPlaces: 2 }) // 12.60% formatPercent(0.126, { decimalPlaces: 2, trimTrailingZeros: true }) // 12.6% formatPercent(1234.5, { withSign: true }) // 1,234.50%漲跌幅場(chǎng)景常用 formatPercent(-0.005, { decimalPlaces: 2, allowNegative: false }) // -- formatPercent(12.34, { inputScaled: true }) // 12.34%3.3 與貨幣格式化共享底層邏輯的設(shè)計(jì)百分比格式化和貨幣格式化看起來(lái)是兩套函數(shù)但它們的核心邏輯高度重疊千分位格式化、整數(shù)部分拆分、符號(hào)處理、小數(shù)位補(bǔ)齊。如果各寫各的以后調(diào)整千分位規(guī)則或符號(hào)規(guī)則時(shí)就要改兩處。我建議抽一個(gè)內(nèi)部公共函數(shù)formatNumberParts專門處理“絕對(duì)值轉(zhuǎn)千分位整數(shù)部分 小數(shù)部分 符號(hào)前綴”的通用邏輯formatCurrency 和 formatPercent 都調(diào)用它。這樣既減少了重復(fù)代碼也能保證兩套輸出的風(fēng)格一致。function formatAbsNumberParts( absValue: number, decimalPlaces: number, thousandSeparator: boolean, trimTrailingZeros: boolean ): string { const factor Math.pow(10, decimalPlaces); const rounded Math.round((absValue Number.EPSILON) * factor) / factor; const [intPart, decimalPart] rounded.toFixed(decimalPlaces).split(.); const formattedInt thousandSeparator ? intPart.replace(/\B(?(\d{3})(?!\d))/g, ,) : intPart; let decimalStr decimalPart || ; if (trimTrailingZeros decimalPlaces 0) { decimalStr decimalStr.replace(/0$/, ); } return decimalStr ? ${formattedInt}.${decimalStr} : formattedInt; }這里的思路是把“數(shù)字的展示玩法”千分位、小數(shù)位、去零和“語(yǔ)義玩法”貨幣符號(hào)、百分比符號(hào)、正負(fù)號(hào)括號(hào)分離。后續(xù)如果要統(tǒng)一改千分位分隔符為空格或者改成印度數(shù)字分組只需要?jiǎng)右粋€(gè)函數(shù)。4. 鴻蒙、iOS、Android 三端復(fù)用時(shí)的兼容性整治工具函數(shù)寫好了真正讓它成為“跨端核心資產(chǎn)”的關(guān)鍵一步是處理三端運(yùn)行環(huán)境的差異。React Native 項(xiàng)目在鴻蒙端跑起來(lái)后我們遇到了一堆在模擬器上根本暴露不出來(lái)、只有真機(jī)上才出現(xiàn)的兼容性問(wèn)題。4.1 Intl.NumberFormat 在不同 Runtime 上的表現(xiàn)差異剛寫第一版時(shí)很多同事習(xí)慣性用Intl.NumberFormat來(lái)做千分位。在 iOS 的 JavaScriptCore 里表現(xiàn)正常在 Android 的 Hermes 里基礎(chǔ)用法也正常但到了鴻蒙的 JS 運(yùn)行時(shí)某些版本對(duì)Intl.NumberFormat的支持不完整特別是currency風(fēng)格的貨幣符號(hào)映射有的設(shè)備顯示成CN¥有的顯示成¥甚至有的直接返回不帶符號(hào)的數(shù)字。這個(gè)問(wèn)題非常容易在聯(lián)調(diào)階段被漏掉因?yàn)轼櫭赡M器和開(kāi)發(fā)者常用的高端真機(jī)可能表現(xiàn)正常但用戶的大眾機(jī)型上就會(huì)翻車。我們的解決方案很簡(jiǎn)單放棄依賴 Intl.NumberFormat千分位和貨幣符號(hào)全部手動(dòng)處理。這也意味著工具函數(shù)完全不去探測(cè)宿主環(huán)境支持什么只依賴最基礎(chǔ)的 JS 語(yǔ)法穩(wěn)定性大幅提升。4.2 舍入規(guī)則與浮點(diǎn)誤差的跨端一致性另一類問(wèn)題是舍入行為不一致。toFixed在不同 JS 引擎上對(duì)某些邊界值的行為歷史上就存在爭(zhēng)議比如(1.005).toFixed(2)在不同引擎上可能得到1.00或1.01。雖然現(xiàn)代引擎大多修復(fù)了但鴻蒙端的新運(yùn)行時(shí)是否完全對(duì)齊我們沒(méi)有十足的把握。所以最終的 formatCurrencyFromCents 干脆繞開(kāi)了toFixed用整數(shù)運(yùn)算直接算小數(shù)位formatPercent 雖然還用toFixed但統(tǒng)一乘了Number.EPSILON做補(bǔ)償并且在三端真機(jī)上跑了一輪斷言用例。這里給的結(jié)論是能繞開(kāi)就繞開(kāi)繞不開(kāi)就加補(bǔ)償?shù)^不能假設(shè)所有端行為一致。4.3 字體渲染與 UX 細(xì)節(jié)從“能用”到“好看”格式化函數(shù)輸出的字符串最終要渲染到界面上不同端對(duì)貨幣符號(hào)的字體渲染也有差別。鴻蒙默認(rèn)字體對(duì)¥的渲染和蘋方對(duì)¥的渲染在寬度、基線位置上不完全一致。如果金額展示在表格或者卡片里可能因?yàn)榉?hào)寬度差異導(dǎo)致數(shù)字不能對(duì)齊。此外負(fù)數(shù)括號(hào)格式(¥1,000.00)在金融場(chǎng)景常用但在窄屏設(shè)備上括號(hào)容易和相鄰元素重疊。我們后來(lái)加了兩個(gè) UI 層面的約定金額類文本允許文本省略時(shí)不顯示貨幣符號(hào)只顯示1,000.00漲跌幅場(chǎng)景用顏色表示正負(fù)同時(shí)保留/-符號(hào)方便色弱用戶識(shí)別。這些細(xì)節(jié)不是格式化函數(shù)本身的問(wèn)題但如果沒(méi)有統(tǒng)一的格式化層這些 UX 約定根本無(wú)從談起。4.4 用測(cè)試矩陣守住三端一致性跨端一致性的底線不是靠代碼自證而是靠測(cè)試矩陣。我們?cè)?CI 里跑同一套 Jest 用例覆蓋 formatCurrency 和 formatPercent 的幾十種輸入輸出斷言在真機(jī)測(cè)試階段專門做了一張三端對(duì)照表格同一批輸入在三端的截圖輸出必須逐字一致。輸入iOSAndroid鴻蒙期望結(jié)果12345678分¥123,456.78¥123,456.78¥123,456.78¥123,456.78-500分括號(hào)格式(¥5.00)(¥5.00)(¥5.00)(¥5.00)0.126百分比12.60%12.60%12.60%12.60%null--------這張表我會(huì)建議每個(gè)涉及跨端的項(xiàng)目都建一份。格式化的斷言不通過(guò)其他業(yè)務(wù)邏輯都不要測(cè)了因?yàn)檎故緦右呀?jīng)錯(cuò)了。5. 異常輸入與邊界場(chǎng)景格式化函數(shù)也要有“防御裝甲”很多頁(yè)面崩潰和數(shù)據(jù)顯示異常不是業(yè)務(wù)邏輯的問(wèn)題而是格式化函數(shù)收到了意料之外的輸入。既然 formatCurrency 和 formatPercent 要作為公共資產(chǎn)在全項(xiàng)目鋪開(kāi)它們就必須對(duì)異常輸入有明確的防御策略。5.1 常見(jiàn)異常輸入與兜底策略我把項(xiàng)目中實(shí)際遇到的異常輸入歸成幾類每類都明確處理方式異常類型示例兜底行為空值null、undefined、空字符串返回--或配置的 emptyPlaceholder非數(shù)字字符串a(chǎn)bc返回空值占位符NaN / InfinityNaN、Infinity返回空值占位符字符串?dāng)?shù)字12345、12.5按數(shù)字解析后格式化超過(guò)安全整數(shù)范圍9007199254740993項(xiàng)目?jī)?nèi)部約定按最大值截?cái)嗷驋伄惓_@里最重要的原則是格式化函數(shù)永遠(yuǎn)不拋異常。它處于展示鏈路的末端一旦拋異常輕則頁(yè)面白屏重則整個(gè)列表渲染失敗。兜底返回--至少能讓用戶知道“這里應(yīng)該有一個(gè)值但現(xiàn)在沒(méi)拿到數(shù)據(jù)”這比直接崩潰更友好。5.2 超大金額、超小金額與精度溢出金融應(yīng)用還會(huì)遇到余額寶收益這類超小數(shù)字比如年化收益每日入賬0.000123元。如果走 formatCurrencyFromCents0.000123元轉(zhuǎn)成整數(shù)分是0.0123分四舍五入變成0.01分展示成¥0.00其實(shí)沒(méi)問(wèn)題因?yàn)榇_實(shí)沒(méi)有滿一分錢。但如果產(chǎn)品經(jīng)理要求“顯示到厘”那就得在數(shù)據(jù)層提前把最小單位換成厘而不是在格式化層硬湊。超大數(shù)據(jù)方面如果后端傳的金額超過(guò) JS 安全整數(shù)范圍parseInt的精度就會(huì)丟失。我們的方案是接口層對(duì)超大金額統(tǒng)一用字符串傳遞格式化層通過(guò)BigInt或者字符串拆分的方式處理。不過(guò)目前 99% 的金融場(chǎng)景不會(huì)到萬(wàn)億級(jí)別所以這個(gè)處理做成可選擴(kuò)展不做進(jìn)主路徑避免把核心函數(shù)搞得太重。5.3 推薦的單測(cè)用例清單格式化工具是全項(xiàng)目的基石函數(shù)單元測(cè)試的性價(jià)比極高。我強(qiáng)烈建議至少覆蓋這些用例describe(formatCurrencyFromCents, () { test(常規(guī)金額千分位和小數(shù)位, () { expect(formatCurrencyFromCents(12345678)).toBe(¥123,456.78); }); test(負(fù)數(shù)符號(hào)格式, () { expect(formatCurrencyFromCents(-500)).toBe(-¥5.00); }); test(負(fù)數(shù)括號(hào)格式, () { expect(formatCurrencyFromCents(500, { negativeFormat: parenthesis, symbolPosition: suffix })).toBe(($5.00)); // 注意實(shí)際返回會(huì)帶上符號(hào)按實(shí)現(xiàn)斷言 }); test(空值兜底, () { expect(formatCurrencyFromCents(null)).toBe(--); }); test(非法輸入兜底, () { expect(formatCurrencyFromCents(abc)).toBe(--); }); }); describe(formatPercent, () { test(常規(guī)比例轉(zhuǎn)百分比, () { expect(formatPercent(0.126)).toBe(12.60%); }); test(千分位百分比, () { expect(formatPercent(12345.678)).toBe(1,234,567.80%); }); test(正號(hào)展示, () { expect(formatPercent(0.0345, { withSign: true })).toBe(3.45%); }); test(負(fù)數(shù)被禁止時(shí)兜底, () { expect(formatPercent(-0.01, { allowNegative: false })).toBe(--); }); test(已放大輸入, () { expect(formatPercent(12.34, { inputScaled: true })).toBe(12.34%); }); });我特別想強(qiáng)調(diào)“負(fù)數(shù)被禁止時(shí)兜底為空值”這個(gè)設(shè)計(jì)。在金融場(chǎng)景里利率或收益率出現(xiàn)了負(fù)數(shù)往往意味著異常。與其展示一個(gè)讓人困惑的-3.00%不如用占位符觸發(fā)后續(xù)的異常判斷邏輯。當(dāng)然盈虧類場(chǎng)景負(fù)數(shù)必須展示所以allowNegative默認(rèn)是true具體用哪個(gè)由業(yè)務(wù)層顯式?jīng)Q定。5.4 從“工具函數(shù)”到“資產(chǎn)”的團(tuán)隊(duì)落地經(jīng)驗(yàn)最后分享一點(diǎn)團(tuán)隊(duì)落地的經(jīng)驗(yàn)。工具函數(shù)寫完之后我們做了一件事把它從普通的 utils 目錄提升到了獨(dú)立的基礎(chǔ)庫(kù)里并寫了一份格式化規(guī)范文檔明確了以下幾條團(tuán)隊(duì)紅線所有金額展示必須走 formatCurrency / formatCurrencyFromCents禁止在業(yè)務(wù)代碼里手寫toFixed(2)。所有百分比展示必須走 formatPercent禁止手寫(num * 100).toFixed(2) %。數(shù)據(jù)層拿到的金額如果單位是“元”必須在數(shù)據(jù)轉(zhuǎn)換層統(tǒng)一轉(zhuǎn)成“分”展示層只認(rèn)分。新增格式化需求比如新貨幣、新舍入方式必須改工具庫(kù)并在單測(cè)里補(bǔ)充用例不允許在業(yè)務(wù)組件里臨時(shí)拼字符串。這幾條紅線剛開(kāi)始執(zhí)行時(shí)會(huì)有阻力尤其是一些老手覺(jué)得“就一行代碼沒(méi)必要封裝”。但經(jīng)歷一次跨端金額對(duì)賬事故后團(tuán)隊(duì)就沒(méi)人再質(zhì)疑了。工具函數(shù)本身不復(fù)雜真正有價(jià)值的是把它作為“資產(chǎn)”對(duì)待的制度約束。后續(xù)如果要把這套邏輯復(fù)用到 Flutter 或者其他跨端方案核心的舍入規(guī)則和邊界場(chǎng)景清單也可以平遷過(guò)去這才是它作為“核心資產(chǎn)”的意義所在。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
亚洲精品 欧美精品| 九九综合网| 超碰国产情侣自拍网| 99抽插| 国产乱码精品久久久久久| 欧洲小说色图视频另类| 久久精品黄色| 亚洲天堂AV在线播放| 天天欧美欧美亚洲网| 精品人妻一二三四区视频| 蜜臀一区二区三区亚洲最新章节在线观看 - 高清蜜臀一区二区三区亚洲全集播放 | 久久久一区二区三区四区五区| 日本免费中文字幕在线| 亚洲天堂另类小说男人| 激情文学亚洲| 自拍偷拍 高清无码| 青青草丝袜在线视频| 婷婷15月天青娱乐| 天天躁日日躁xxxxx| 久久九九综合| 2019亚洲男人天堂| 少妇3P性爱自拍| 九九热免费国产视频婷婷伊人| 欧美色交| 99性视频| 性欧美| www.av在线视频| 久jiu久神马影院| 女人天堂网| 丁香五月天激情网站| 欧美精品亚洲精品日韩传电影| 亚洲爽图| www.操| 老熟女网站| 欧美专区日本专区| 蜜臀va69| 中文字幕视频在线观看一区二区| 九九热av| 中文字幕高清20页视频| 天天欧美| 欧美另类色图片| 国产h小视频在线观看免费| 婷婷五月综合在线| 中文字幕视频二区| 九九久久首页| 99老司机精品视频在线观看| 亚洲情色在线| 国产一区二区三区影片| 久久国产精品m码| 嗯嗯啊在线视频| 亚洲色图殴美色图激情乱伦| 肉丝中文无码高清| 色爱国产| 久久啊啊| 97超碰色屌| 最新国内自拍av免费| 天天香香欲综合| 综合久久婷婷| 欧美劲爆第一页| av在线人气| 日韩乱伦AⅤ| 夜夜高潮夜夜爽高清视频一| 天天看,天天做| 夜夜骑夜夜操| 蜜桃臀一区二区三区久久| 日本99热| 国产福利小视频高清在线观看| 国产成人精品必看| 欧美性爱一区二区三区| 欧美情色男人的天堂| 操逼逼福利视频| 99少妇内射| 亚洲一区二区三区麻豆传媒| 久久人妻视频| 亚洲综合成人网| av网站国产主播在线| 经典丝袜一区| 在线视频一区二区传媒| av资源在线观看少妇| 午夜一区二区三区国产| 曰韩精品九九无码| 亚洲一曲日韩精品| 九色 人妻 大香蕉| 亚洲精品中文字幕一区在线视频| 亚洲字幕一区二区| 国产60页| 欧美性高潮| 欧美美逼| 亚洲欧美国产va在线| caopeng97| 免费的黄片wwwwww| 黄色小视频日本txt| 97色97好| 蜜色网色哟哟| 色99色| 嗯嗯嗯啊啊啊在线免费观看| 日本欧美成人片AAAA| 免费操逼视频下载| 日日夜夜天天| 日韩97| 超碰在线1234区| 亚洲情色在线| 人人操人人操人人操人人操人人操人人人11.CM| 亚洲熟妇综合久久久久久| 亚欧操逼片在线观看 | 中文字幕少妇色| 一区二区三区四区姦女| 97玖玖超碰| 欧美另类自拍 | 东京男人天堂| 日本午夜福利视频| 亚洲天堂情色| 欧美 精品国产制服第一页| 97Ai亚洲| 人人看人人爰人人操| 嫩呦国产一区二区三区AV| 成人性爱AV在线免费观看| 91欧美性| 亚洲黄色a级片| 亚洲欧美伦综合| 青青草久草AV| 91|九色|国产熟女| 有码人妻系列| 成人小电影网站tex| 天天操人人操狠狠插| 国产福利第一视频| 91插B网站| 久久久久久久| 日韩人妻播放| 亚洲欧美另类激情小说| 美国黄片aaa| 91强奸乱轮| 日韩欧美麻豆大片| 日韩BBN| 天天做天天爱夜夜爽毛片试看| 久久大香蕉| 少妇高潮喷水无套久久久久久| 欧美后入| 久久色一区| 久久精品28| 午夜福利精品| 五月开心久久AV官网| 成年人黄色视频免费| 色丁香五月婷婷| 国产久久日韩网站导航| 明星性猛交ⅹxxx乱大交| 成人三级片无码| 人人搞人人插人人操| 久久粉色| 999999精品| 96精品一区| 偷拍 亚洲 欧美| 99re国产精品视频| 性爱AV天堂| se吧提供91精品国产91久久久久久 | 92午夜免费福利视频| 欧美少妇高潮久久91| 1769国内精品视频| 天天舔天天日天天射| av在线不卡一区二区三区| 噜噜噜久久亚洲精品色情| 免费人成在线观看网站品爱网| 天天摸夜夜摸| 欧美偷拍区| 亚洲精品一区二区免费在线观看| 无遮挡h肉动漫在线观看| 人爽不卡视频| 少妇极品熟妇人妻无码| 婷婷色色网| 亚洲一区在线观看欧洲| 裸模AV女优| 日本狂喷奶水在线播放212| 偷拍五区| 91亚洲人电影| 无码视频黄色网战| 国产家庭乱伦表演| 啊啊啊好大好深| 1二区9| 天天干天天日天天射黄色| 日韩专区久久久| 性色avv| 乱伦日本色图AⅤ| 国内精品久久人妻性色av| 午夜一区| 国产日韩欧美三级片| 久久国产免费激情视频| 天美传媒AV在线播放| 精品美女少妇一区二区| 欧美色爱综合| 中文欧丝袜诱惑| 免费成人在线熟妇网| 99r九九| 人人妻人人操人人乐| 欧美人妻精品一区二区| 国语精品内射在线观看| 一类无码操逼视频| 日本一区二区不卡精品| 中国一区二区亚洲人妻| 无码操逼网| 亚洲欧洲无码一区夜| 美欧老女人97| 国产亚热在线久久| 黑人性欧美| 性色aV一区二区三区噜噜| 久久在肏| 国产偷拍网站| 丰满人妻无码一区二区三区| 国产精品激情久久久久久久| 99热这里只有精品地址| 久久婷五月| 欧美 亚洲 制服 精品| 伊人大香蕉在线| 大香蕉天天看妹子| 超碰免费在线| 欧美美女啪啪视频| 亚洲天堂一区| 91美女视频电影| 综合色图区| 超碰在线一区| 国产熟女精品区| 97超碰伊人| 欧美制服另类丝袜| 国产一级做a爰大片免费久久| 欧美淫乱视频| 中文字幕精品乱码| 99re9这里只有精品| 蜜乳AV.COM| av天堂电影网| 91美女在线| 怡红院亚洲怡春院av| 国产青一二三| 黄色成品网站| 国产又粗又又黄又猛| 91人妻精华帖| 97人人模人人爽人人| 丝袜视频网国产90| 国模不卡一本二本三电影| 蜜臀久久久久久999| 奇米四色网| 日韩欧视频| 1204av韩国| 碰碰97| 亚洲欲| 色婷婷激情| 国产三级资源在线观看| 国产精品熟女一区二区三区| 久久成人精品| 欧美日韩淫加| 欧美青青视频| 大学生口爆吞精| 欧美精品三区| 亚洲天天操| 国产高清成人免费视频| 欧美一级在线观看成人| 三级日韩一区二区三区| 久久性爱视频99| 国产呦精品系列在线观看| 国产精品3| 伊人嫩草| 久久久久久久性爱| 岛国激情视频软件| 国产AV超爽| 天天干天天燥| 亚洲国产福利视频| 欧亚 另类 久| 美女91在线| 国产视频一区二区三区在线免费观看 | 超碰97导航| www欧美91| 91精品91久久久久77777俄罗斯老妇姓x| 日本天堂在线播放| 青青草中文字幕| 国产操伦| 哈哈操电影AV| 97干色天堂| 日韩啪啪啪视频| 亚洲 另类 丝袜 自拍 动漫| 亚洲资源网| 91操熟女视频| 亚洲黄色视频在线观看视频| 亚洲午夜福利在线影院| 日韩AV中文字幕电影| 97精品网站| 亚州91| 人妻丰满熟妇一区二区三| 九九久久99| 大香蕉欧美国产日韩高潮| 国产激情在线| 网页导航五月天免费一二三区| 青青欧美在线| 亚洲色图亚洲| 亚洲色欲天天人妻无码系列专区| 96精品在线| 日本 情色 1区| 日欧操屄视频| 91熟女少妇| 欧美不卡在线一区二区| 囯产精品一区二区三区线|亚洲人成无码网WWW动漫|国产精品免费一级... | 亚洲一区二区AV| 久操精品网| 97久久天天综合色天天综合色电影| 啊啊啊啊啊啊啊啊啊啊在线观看| 亚洲双插| 亚洲av综合色区无码一| 日韩欧美偷拍美女视频| 久干9操| 欧美午夜视频| 伊人五月天激情| 激情视频一二三| 精品偷拍13p欧美dodk视频| 超碰精品| 日本Xx性爱| 夜夜福利| 日韩成人大片在线观看| AV久日| 日本色色网| 亚洲Av诱惑| 在线黄页看毛片| 蜜臀久久久99久久久久| 免费农村成人少妇人妻Aa一区二区视频| 97免费视频在线| 天天射网| 男人a天堂手机在线版| 精品二区三四区五电影 | 在线观看色视频| 天堂精品| 日本免费不卡二区| 国产AV激情无码久久无码| 色臀aV| 久久人妻无码毛片A片麻豆| 久久久性少妇| 99热色精品| 日韩有码 一区二区三区| 熟妇高潮精品一区二区三区下载| 婷婷导航| 91成人久久| 九七超碰人人乐| 久久国产99精品72福利| 免费亚洲黄色视频在线观看| 黄色大片视频在线免费看| 免费亚洲国产精品久久一区| 女色视频社区| 国产粉嫩出水在线播放| 亚洲无无码αⅴ每日更新| 色色九区| 亚洲天堂另类| 热G综合热G中文| 亚洲性少妇| 懂色AV一区二区三区| 在线免费观看日韩一区| 综合色好色| 97欧美色综合| 性爱欧美五月| 91女神在线视频| 无码在线亚洲| 精品一区二区在线针对华人免费观看这里只有精品免费观看 | 国产久久久久久| 日韩99神马视频片| 又大又黄国产| 爱爱动态120秒| 日韩亚洲美州欧洲综三区一品在线| 无码黑人精品一区二区三区三| 福利视频香蕉免费一区二区在线| 91痴汉| 超碰久久精品| 大香蕉99re| 亚洲欧洲久久天堂| 大奶尤物鲍汁淫荡欧美视频粉嫩夜夜骚| 久久草大香蕉| 啊灬啊灬啊灬好深灬快高潮了动漫-国产字幕国产在线观看-B049AV | 色色五月天婷婷| 天天享受天天看| 久久视网78| 亚洲色图国产另类| 青青草导航在线视频| 久妇网| 免费看污网址| 91处女在线视频| 久久久9 9 9精品| 999热这里只有精品| 综合网亚洲| 欧美黄色片在线播放| 国产精品永久免费10000| 欧美系列在线一区二区| 色妺妺在线视频| 极品久久久久久久久久久久久久| 在线观看啊啊啊啊啊| 啊啊啊啊啊在线| 亚洲一级性爱视频免费看| 一本一道vs波多野结衣| 亚殴在线| 天天日熟妇| 麻豆久久一区二区三区| 玖玖资源综合在线视频| 91爱综合| 国产精品一区二区麻豆| 国产成人无码a| 国产精品一区二区黄片| 蜜桃臀AV在线| 国产偷人伦激情在线观看| 强奸乱伦av电影| 麻豆婷婷成人一二三| 在线啊啊啊啊| 综合色好色| 亚洲精品亚洲人成在线麻豆| 亚洲美女精品| 亚洲性天堂| 五月天玖玖资源站| 亚洲日韩XXX| 亚洲性网| 婷色五月| 久久久久久无码人妻中文字幕| 天天看天天日| www.狠狠干.coom| 精品十八在线观看| 欧美日韩精品一区二区三区高清| 中文一区二区婷婷视频| 精品国产乱码久久久久久久| 5278欧美一区二区三区| 久久久久久中文版| 一级人妻性爱视频| 天天干天天日天天射黄色片| 亚洲综合影院| 久久久久13| 国产在线激情| 天天操天天插| 欧美呦呦性爱| 日韩资源网| 日韩精品黄片免费观看| 白嫩白嫩的午夜九久久久久久久久久久久成人剧场 | 亚洲成人AB| 久久亚洲精品成人av| com 首页 18岁 禁区 女优 免费 精选 同城| 一起草精品人妻| 欧美性爱超碰97| 狠狠干综合| 人人操人人爽人人操人人| 久久久久久91香蕉国产| 亚洲欧洲精品视频发布| 色综合加勒比| 久久久久网站-538在线视频-欧美永久乱码 | 99久久99久久免费精品蜜臀| 色女99一级片在线观看| 国产成人精品必看 | 国产在线精品电影观看| 性爱av在线免费观看| 亚洲a色| 欧美人妻二区三区| AV污污污污| 亚洲国产精品无石码久久| 久久999久| 大香蕉综合网| 成人av影院在线观看| 嗯~啊~快点 死我视频免费看网站| 欧美日韩91| 国产乱伦亚洲| 精品性爱| 精品一区二区三区蜜桃| 97亚洲资源| 爱射综合| 免费操逼视频下载| 久久草草亚洲蜜桃臀| 久久久性少妇| 啊啊啊啊二区好大| 精品女人999| 欧美强奸乱| 午夜亚洲| 成人久久久精品| 综合色图,成人综合网| av日韩国产一区二区| 女人天堂av在线播放| 亚洲激情在线| 亚洲日韩XXX| 日本一区99| 国内91熟女人妻丝袜天天精品视频在线 | 狠狠操夜夜| 热思思免费视频| 精品一区二区三区18| 丝袜av一区二区三区| 三级三级三级日本99| 另类天堂| 国产69精品久久久久99尤物| 人人性爱视频免费| 亚州综合色| 91高潮| 性一级黄色录像片网站导航| 色香网| 久热大香蕉网站| 亚洲伊人久久精品影院| 91天美免费| 亚洲日韩资源| 一区二区播放| 加勒比色99999| 亚洲清纯综合| 美女9118禁| 少妇无码999| 七月婷婷综合| 日本精品五区| 91大神精品长腿在线观看网站| 久午视频| 亚洲精品乱码线路中文字幕| 午夜乱轮操逼视频免费看| 欧美性爱无码一区二区三区| 96久久精品一二三区色欲| av资源在线播放天堂| 国产操逼逼网| 丁香五月天啪啪| 欧美99| 六月丁操逼| 精品女同一区| 欧美欧美少妇| 丰满美女一级毛片在线播放| 中文字幕人成乱码熟女香港| 最新日韩黄片| 五月天综合网| 三上制服丝AV| 欧美日韩人妻精品一区二区三区 | 国产丝袜高跟美女av免费观看| 亚洲做性| 国产一区二区成人av在线播放| 精品久久久久av影院| 久久婷婷影院| 老熟女区| 日本幼女18+| 无码不卡八戒| 國產尤物AV尤物在線觀看| 国产精品一区人妻精品阁在线| 久久男人网| 青青草大香蕉视频| 三级网色| 久久极品一区二区| 五月天AV资源| 懂色AV蜜臀无码精品APP| 欧美精品四区| 色欧美在线| 精品偷拍13p欧美dodk视频| 欧美另类色图片| 好爽要喷了| 亚洲暴力强奸AV| 亚洲熟妇丝袜在线观看| 国产又长又大又粗的视频| 亚洲视频中文一区| 久久久精品国产亚洲伊人| 18+91网站| 人妻一区视频| 69人妻精品丰满熟女区| 国产精品爆乳懂色蜜乳| 香蕉在线一区二区三区| 人人妻天天做天天爽| 日韩国产欧美伦理在线| 天天碰操中国年青熟妇| 国产精品视频内谢女人| 992这里有精品| 97欧美色| 五月天综合在线| 成人小电影网站tex| 久久人妻丝袜一区二区三| 色偷偷2020免费视频播放| 丝袜熟女一区二区三区| 91美女视频电影| 日韩精品1区2区中文字幕| 啊灬快c我灬啊灬用力灬啊灬-国产精品性做久久久久久-成人AV | 天天操夜夜操| 江都AV在线| 午夜视频黄| caopeng97人妻| 91精品无码久久久久久久| 999久久久九| 韩国成人精品久久久免费看| 久操免费电影| 96AV精品| 超碰国产精品久| 风骚少妇视频中文字幕| 丁香激情网| 久久久性| 久久久久久裸体| 中文字幕精品一区二区精品| 国产60页| 成人十八禁日韩欧美一二三| 欧美精品999| 国产精品久久久| 天天综合网1| 久久久97| 国产精品亚洲高清在线| 97chaopengongkai| 操91| 97精品国产97久久久久久免费| 日韩无码视频黄色| 97超碰国产亚洲精品| 丁香五月天视频| 欧美精品精品一区二区| 精品大全99999| 天天操女人| 亚洲二区精品在线观看| 少妇久久久久久| 色香综合天天影视综合| 久久9亚洲| 偷拍 精品另类 凸凹了四区| 国产乱伦性爱AV| a级成人毛片免费视频高清| 无码久久国产| 91色夜| 亚洲Av噜噜一区二区三区妖精| 99这里都是精品| 看免费的黄片| 九九久久玖玖| 久久久熟女一区| 天堂精品小草| 看日韩美女二区三区免费操逼视频| 波多野结衣被操50分钟免费视频| 日韩小电影| 9 1果冻精品视频| 撸撸成人在线视频| 天堂国产AV| 久久亚洲影院一区二区| 男人精品天堂一区| 肥臀熟女福利视频一区二区| 蜜臀AV网站| 亚洲黄色视频在线观看视频| 国产成人欧美精品在线| 亚洲日韩狠狠撸视频| 国产精品久久久久久久久久久久久久久久 | 婷婷三区| 大香蕉伊人网WWWn0n| 欧美嫩性色| 桃花色涩综合影院| 日人妻视频91| 天天色,天天干,天天干| 久久精品99久久久久久| 亚拍在线| 男人的天堂日韩| 天天操天天日青青草超碰av| 超碰一区二区| 色网亚洲人| 成年在线视频日本亚洲在线视频区精品江靖宇公司 | 国语少妇精| 97精品一区二区视频| 国产91会所女技师在线观看| 视频一区二区三区精品| 久久亚洲天堂| 国产美女91| 国产在线激情| A级片一区| A级片日韩欧美国产欧美视频精选观看| 亚洲性天堂| 欧美一区二区三区不卡高清视频| 久久精品国产欧美日韩亚洲欧美日韩中文久久国产一区 | 久久啊啊啊视频| 91精品操美女| 亚洲情色综合| 在线观看成人性爱免费小视频| 亚洲精品无码少妇久久| 日本一本一区二区三区四区五区欧美日韩中文字幕 | 日本一区二区不卡精品| 综合五月天| 久久九操在线观看| 99热销国产这里有精品| 岛国激情视频在线观看| 水野优香在线观看| 麻豆激情综合| 天天综合色图| 久精品无码av一区二免费国产在线观看 | 久久AV无码网址| 熟女一区二区| 天天欧美色| 亚洲熟女乱综合一区二区三区| 91美女视频电影| JIZZJIZZ亚洲女人被躁| 一级性爱aaaa| 欧美色一二三| 亲子敌伦对白在线播放| 丁香五月激情综合| 天天看高清麻豆| 综合另类| 日本一本一区二区三区四区五区欧美日韩中文字幕| 久草久日| 国产91会所女技师在线观看| 色婷婷在线视频| 2020天天色综合| 久久精品国产Aⅴ| www久| 极品一区二区三区免费| 岛国福利在线精品播放| 另类图片五月| 国产9区| 综合欧美亚洲| 超碰免费在线| 综合第一页| 另类小说五月天| 成人三级片一区二区三区视频| 日本高清有码网址视频| 国产蜜臀在线| 超碰人人超在线观看| 碰人碰碰人人开房人肉| 亚洲最新a在线观看| 91美女視頻| 国产一区二区三区久久久精品| 激情综合97| 我要去看2个日本美女.com曹逼| 97人人草| 人人妻人人澡人人爽人人精品浪潮| 欧美一级色| 丰满人妻一区二区三区免费| 色欧美天天| 亚洲无码太久| 九九久久国产精品怡红院| 国产AV超爽| 人妻少妇精品久久久久久久| 蜜臀人妻少妇久久在线观看| 性色AV网站| 级品肉射| 婷婷91| AⅤ片水多多| 成人欧美日超碰| 久久人人爽人人爽人人片Ⅴ| 精品免费成人久久| 色性欧美| 自拍偷拍草一草| 少妇人妻在线| 九九色色| 成人免费性爱视视| 国产AV天美传媒一区二区三区| 天天摸,夜夜摸| 92性色国产午夜福利在线661| 中文字幕无码不卡啪啪| 99久久网站| 人人性爱视频免费| 操淫穴亚洲五月丁香 | 久久99网站| 亚洲AV无码乱码| 五十路熟女工口| 欧美综色欧| 天天欧美色| 伊人黄色视频免费观看| 91性网| 亚洲 另类 丝袜 自拍 动漫| www老逼91| 日韩av影片在线观看| 国产老女人久久毛| 欧洲精品欧洲精品| 亚洲免费精品一区| 99ri视频| 操逼视频亚洲| 加勒比aⅴ| 人妻素股| 男人精品天堂一区| 熟女丝袜视频| 99热综合| h4610国产人妻| 国产精品爆乳懂色蜜乳| 男人天堂新| 热久久无毒不卡| 福利大香蕉| av东京热男人的天堂| 97香蕉人人乳| 超碰在线人妻不卡| 午夜精品久久久久久久男人的天堂 | 国产美女mm131爽爽爽爽| 日韩欧美aⅴ综合网站发布| 亚洲中文字幕在现观看| 亚洲 欧美 色图| 超碰九7免费| 九九九精品| 91色夜| 中文字幕熟女人妻丝袜丝| 亚洲一区二区专区-国产丝袜精品丝袜-成人AV| 色老汉玖玖爱| 小草三级久久观看| 超碰地址97| 久久九七| 60秒试看最爽10分钟网站| 丝袜制服字幕在线| 看日韩美女二区三区免费操逼视频| 熟女字幕| 国产欧美日韩在线不卡第一页| 一区二区娱乐网站| 日本色婷婷| 久久精品国产精品亚洲艾通辽熟妇| 国产欧美日韩女同性恋ww喷水精品 | 91色婷婷综合久久中文字幕二区| 久久一级无码精品毛片6| 天天操天天舔| 日本色色色| 九九久久九九久久| 国产乱弄免费在线视频。 | 精品人妻1区| 久久国产性爱| 曰韩成人免费视频| 天天欧美色| 午夜精品人妻二区三区| 综合网亚洲| 太久视频| 夜夜爽妓女| 欧洲大香蕉| 神马九九| av天堂5| 色婷婷综合久久久久中文一区二区| 亚洲日韩东京热一区| 男女啊啊啊| 国产乱色国产精品免费视| 日韩无码专区| 欧美亚洲手机在线| 天天操天天射天天日| 亚洲色图激情小说| 天堂在线一区二区| 人妻少妇精品久久久久久久| 91精品女厕偷拍视频| 啊好大好舒服| 无码人妻一区二区三区四区老鸭窝| 久操九九九九九九九九九九九九九九九九九九九九九九九九九九九九 | 黄片在线免费在线观看| 成人精品一区二区三区| 成人怡红院| 免费A V在线播放| 97蜜桃综合| 人妻第一页| 91c色| 人妻久热在线| 欧美乱欲| 另类天堂| 人妻少妇无码| 3P乱轮视频| 亚洲欧洲第二视频在线观看色图| 伊人操| 2024黄色视频| 色婷婷小说| 五十路成人在线视频二区三区| 亚洲欧美日韩制服另类| 欧美性爱97超碰 | www.人人摸在线视频| 久久九色| 激情文学小说一区二区 | 亚洲999综合| 亚洲欲色| 五月婷婷综合激情| 伊人九九| 五月天婷婷基地| 97资源站国产精品| 牛黄色久午久| 久久久久久久久久久精| 国产动漫操逼视频| 欧美成人精品欧美一级乱黄一区二…| 肉嘟嘟www视频在线观看高清| 99re6国产精品99re| 亚洲aV无码成人在线观看| 97久久国产精品| 欧美精品自慰系列寂寞少妇| 青草一区二区| 久久黄片国产一区二区| 国产丰满少妇久久久精品影院| 涩涩涩综合| 亚洲宗合网| 久久婷婷五月综合| 91亚洲网站| 2025亚洲男人天堂| 91天堂色男人的天堂| 亚洲第一页综合在线| 啊啊啊啊一区| 国产不卡免费在线视频| 97亚洲色图| 熟妇人妻一区二区三在线| 国模无码人体一区二区三| 九九九九精品一区| 日本超碰在线国产一区| 国产捆绑一区| 1024午夜激情男人的天堂| 丁香五月天堂网| 美女裸体无遮挡永久免费观看网站| 试看福利| 欧美AB在线观看| 搡老女人老妇女AAA一VU麻豆| 巨乳特殊服务按摩| 欧美精品偷拍| 欧美成人精品A片免费一区99| 久射吧| 青青操在线亚洲视频观看欧美在线| 亚洲精品美女久久久久久久久| 国产无马在线| 大香蕉中文201| 成人一区二区三区四区| 精品色色| 国产AV毛片| 美女诱惑一区| 另类小说欧美激情校园春色| 97天天在线| 99精品人人爽| 久操大香蕉| 蜜桃视频成a人v在线| 九九九免费视频| 亚洲欧美天| 夜夜夜夜爽| 99热这里只有是精品10| 午夜呻吟欧美| 色综合98| 天天干,天天日| 久久伊人大香蕉| 色色色999| 久久无码电影| 无码日韩人妻av一| 日韩一级久久毛片| 久久一二三四| 国产精品美女视频诱惑| 91爱| 国产福利夜| 欧美狠狠鲁| 懂色AV中文| 超碰 另类 欧美| 色爱欲亚洲| 中文字幕-区二区三区四区视频中国| 九一屌逼| 亚洲诱惑| 美国三级日本三级久久99| 在线小说视频一区| 干美女人妻| 日本三级人妻a人妻一在线| 欧美成人都市人妻| 岛国小电影| 97色色色综合网站| 大香蕉一人在线| 欧美色图下一页| 久久人妻少妇| 1240青青草一区二区三区视频天爱| 女性91网站| 成人一级性爱| 国产视频一区二区免费| 青青草日韩无码| 日韩在线女优天天干| 啊啊啊要高潮了| 婷婷人妻激情| 国产婷婷综合在线观看| 操逼免费视频无码国产| 亚洲精品啪视频| 台湾一区国产高清在线| 郑州宾馆老熟女露脸啪啪| 日本天天吊| 91色综| 蜜桃一区二区三区| 人妻素股| 久久精品国产亚洲5555| 一区二区三区黄片免费观看| 水澄无码AV| 亚洲综合射| 亚洲情色视频| 美女写真| 亚洲丝袜B诱惑| av橘色网站| 国产日韩欧美亚洲精品95| 天天摸天天插天天日| 超碰欧美97资源| 久久久久久久久久久免费精品| 丁香五月婷婷基地| 久草毛片电影怡| 欧美日韩在线小说 | 日韩黄色成人性爱| 一区麻豆 高清中文字幕| 操91| 欧洲黄色网| 激情99| 国产精品久久久亚洲第一牛牛_在线观看 | 国产一区二区免费福利片| 九九久久精品| 国产成人精品日本亚洲语言| 日本不卡二三区| 亚洲日本激情| 少妇天堂网络| 试看60秒 爽| av一区二区三区 中文| 老汉网| 国产理论视频在线播放| 日韩精品操少妇| 国产一级137片内射麻豆| 色哟哟-国产专区| 亚洲色图综合| 色老汉玖玖爱| 九色 人妻 大香蕉| 欧美亚洲图片| 日韩乱码Av| 韩美日操逼| 日韩中文字幕av在线播放| 日本成人免费一区二区三区| 91久久久亚洲| 亚洲国产一级中文综合久久天堂在线免费观看| 国产精品乱码久久久久| 伊色综合天堂色97| 在线日韩精品一区二区三区| 在线 制服丝袜中出 人妻| 国产91 丝袜在线播放00-百度| 九九亚洲| 日本乱人伦片中文三区| 亚洲色9| 超碰在线观看av不卡| 亚av顶级裸体一区二区三区四区五区 | 亚洲精品骚逼| 国产宅男宅女在线观看| 成人八戒网站| 精品国产综合久久福利,热99这里有精品综合久久,99热这里只有免费国产精品,精 | 中文字幕一区二区三区高清| 天天日天天操VV| 五月婷婷丁香中文字幕| 久久久久久久| 一区 欧美 日韩 麻豆| 天美传媒av一区二区| 三级三久久线久久99久目本WW| 测评在线观看AV| 91天美传媒在线| 五月丁香影院| 无码人妻精品一区二区中文| 高清无码91| 按摩中文字幕| 美国日韩黄色片| 综合网欧美| 狠狠爱夜夜干| 九九热免费国产视频婷婷伊人| 国产一区在线观看无码AV | 九九九九一区| 久操 高清| 99久久99九九99九九九| 国产精品国产自产高清AV| 农村少妇久久久久久久| 日日碰视频网| 97免费视频网| 人妻AV 中文字幕的| 91肉丝| 免费国产| 久操 高清| 久久婷婷五月天| 天堂中文日本在线观看| 欧美十八禁视频| 欧美丝袜91| 精品一久久久| 日日夜夜骚| 玖色AV| 中文字幕一区av| 18禁中文字幕| 久久国产乱子伦精品免费女人| 欧美大的香蕉有线电视视频| 激情久久av一区av二区av| 青青草依人大香蕉| oumeisetu综合| 在线无码操| 日本爽爽爽爽爽爽免费视频| 熟妇人妻精品一区二区| 91蜜臀人妻中文字幕在线| 免费国产| 天天天天做夜夜夜夜做| 欧美 日韩 国产传媒| 欧美色图天堂网m| 国产a级精品| 曰本精品久久久| 精久久久91| 色爱综合网欧美| 久久久久久久78| 加勒比AV天堂| 本道在线| 熟妇色99| 热热色91| 久久亚洲一区女同性恋中文字幕 | 欧美日韩免费专区在线| 一区中文字幕二区日韩| 色婷婷成人综合| 亚洲视频一二区| 精人妻无码一区二区三区伊人直播| 色麻豆AV| 天天操妹子| 久久只有精品| 手机午夜电影神马久久| 久久五十路熟女人妻| 天天干天天操天天干天天操| 国产免费永久精品无码| 人人操av| 久久av色| 久热久| 校园春色 亚洲| 精品丰满熟妇人妻一区| 校园春色亚洲| 国产成人无码a| 岛国片在线观看视频亚洲| 夜夜爽33333| 性爱视频无打码在线观看| 美女91网站| 精品国产乱码久久久久久久| 五月天精品| 欧美日韩中文字幕不卡| 亚洲色人| 色在线亚洲视频www| 琪琪精品免费一区二区三区 | 久久是精品| 99久久国产精品免费高潮| 国产精品乱码久久久久| 在线强奷到舒服的无码视频 | 60秒免费视频| 一起草三级AV电影在线观看 | 人妻啪| 麻豆蜜桃视频在线观看| 久久人妇| 日韩欧美大片免费高清啪啪| 熟女性视频| 暴力av在线| 国产高清精品福利| 亚洲黄色网址| 岛国激情视频在线观看| 99日韩| 国产人人干| 欧美强奸乱能| 激情四射五月天| 久久久96| 久久午夜伦| 最新AV在线| 日本岛国黄色网址| 亚洲中亚日激情视频| 一类无码操逼视频| 欧美日韩婷婷中文| 极品综合| 色呦呦、国产精品| 不卡日本一区二区| 国产免费一区二区在线A片视频| 无毛精品| 国产92麻豆天美精品色欲5| 国桃视频产巨乳精品一区二区在线| 亚洲图片激情综合另类| 国产黄色动态精品| 国产一区自拍欧美日韩| 九九九精品一区二区无码| 日韩亚洲中文字幕在线| 青久久| 在线观看AV片| 欧美在线综合| 日韩色欲久久一二三四区| 欧美色自拍| 99久久婷婷国产综合| 欧美色图校园春色| 亚洲国产综合久久天堂| 国产精品在线网站| 日韩少妇一区二区三区| 伊香蕉综合久久久久久久噜噜噜| 超碰人妻中文在线| 男人天堂婷婷五月天校园春色| 久久黄片国产一区二区| 日日爽熟女| 日本不卡高清免v欧美日韩在线观看| 看日韩黄片| 丝袜色综合| 五月丁香影视| 97视频网站| 日韩人妻精品中文字幕| 9久久精品| 麻豆国产97在线| 色综合99999| 精品亚洲国产成人av网站| 精品超碰色| 男人亚洲91首页在线| 秋霞一级A片黄色视频| 青青草影视蜜久久| 麻豆精品三区视频| 日韩乱插| 91制服丝袜中文字幕| 天天透伊人| 日韩高潮一区| 国产专区第一页| 精品美女久久久久|