為什么后端接口返回數字類型1.00前端會取到1?

這得從axios中得默認值說起:

Axios 的?transformResponse


axios?在接收到服務器的響應后,會通過一系列的轉換函數(transformResponse)來處理響應數據,使其適合在應用程序中使用。默認情況下,axios?的?transformResponse?包含以下步驟:

  1. ?解析 JSON 數據:使用?JSON.parse?將響應的 JSON 字符串轉換為 JavaScript 對象。
  2. ?轉換數據:根據響應的?Content-Type,可能進行其他轉換(如將 XML 轉換為對象)。
  3. ?返回數據:最終返回處理后的數據供應用程序使用。

默認的?transformResponse

// node_modules/axios/lib/defaults.js
const defaults = {// 其他默認配置...transformResponse: [function transformResponse(data) {// 對 data 進行任意轉換處理if (typeof data === 'string') {try {data = JSON.parse(data);} catch (e) { /* 忽略解析錯誤 */ }}return data;}],// 其他默認配置...
};

在這個過程中,JSON.parse?將 JSON 字符串轉換為 JavaScript 對象。然而,JavaScript 的?Number?類型在處理某些數字時會自動去除不必要的尾隨零,例如將?12.00?轉換為?12

為什么?JSON.parse?會舍去小數點后的零?

是因為?JSON.parse?將數字字符串解析為 JavaScript 的?Number?類型。在 JavaScript 中,12.00?和?12?被認為是相等的數值,因此?JSON.parse?會自動優化表示方式,去掉不必要的尾隨零。這是 JavaScript 的預期行為,但在某些需要保留特定小數位數的場景下,這可能會導致問題。

解決方案-------------------------------------

1. 后端返回字符串類型的數據

最直接的方法是讓后端在返回JSON數據時,將需要保留小數位數的數字字段作為字符串返回。這樣,前端接收到的數據將保留原始的小數點后零。

后端示例(以Java為例):?

public class ResponseData {@JsonFormat(shape = JsonFormat.Shape.STRING)private String number;// getters and setters
}

返回的JSON:?

{"number": "12.00"
}

前端處理:?

axios.get('/api/your-api').then(response => {const numberString = response.data.number; // "12.00"const number = parseFloat(numberString); // 如果需要數值類型,可以轉換const formattedNumber = number.toFixed(2); // "12.00"
});


2. 自定義transformResponse

如果無法修改后端返回的數據格式,可以在axios的配置中自定義transformResponse,在數據被解析為JavaScript對象之前,對特定字段進行處理,確保數字以字符串形式保留小數點后的零。

示例代碼:?

import axios from 'axios';const axiosInstance = axios.create({transformResponse: [function (data) {let parsedData;try {parsedData = JSON.parse(data, (key, value) => {if (typeof value === 'number' && Number.isFinite(value)) {return value.toFixed(2);}return value;});} catch (e) {return data;}return parsedData;}],
});axiosInstance.get('/api/your-api').then(response => {console.log(response.data); // 數字字段將以字符串形式保留兩位小數
});


3. 在前端手動處理數字格式

如果后端返回的數字是數值類型,且你只需要在前端展示時保留小數點后的零,可以在渲染時進行格式化,而不改變原始數據。

示例代碼(Vue.js):

<template><div>格式化后的數字: {{ formattedNumber }}</div>
</template><script>
export default {data() {return {number: 12.00 // 假設這是從后端獲取的數字};},computed: {formattedNumber() {return this.number.toFixed(2); // "12.00"}}
};
</script>


4. 使用字符串處理庫

如果需要更復雜的數字格式化,可以使用第三方庫如numeral.jsaccounting.js來處理數字格式。

使用numeral.js的示例:?

npm install numeral
import axios from 'axios';
import numeral from 'numeral';axios.get('/api/your-api').then(response => {const number = response.data.number; // 假設是數值類型 12const formattedNumber = numeral(number).format('0.00'); // "12.00"console.log(formattedNumber);
});

總結-------------------------------------------------------

為了避免前后端交互中數字格式的問題,最佳實踐是:

  • ?后端返回字符串類型的數據,明確保留小數點后的零。? ?-----首選
  • ?自定義transformResponse,在數據解析階段對特定字段進行處理。
  • ?前端進行格式化,在展示時根據需要格式化數字。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/899282.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/899282.shtml
英文地址,請注明出處:http://en.pswp.cn/news/899282.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【C++游戲引擎開發】《線性代數》(2):矩陣加減法與SIMD集成

一、矩陣加減法數學原理 1.1 定義 ?逐元素操作:運算僅針對相同位置的元素,不涉及矩陣乘法或行列變換。?交換律與結合律: 加法滿足交換律(A + B = B + A)和結合律( ( A + B ) + C = A + ( B + C ) )。 ?減法不滿足交換律(A ? B ≠ B ? A)。1.2 公式 ? C i j = …

openGauss關聯列數據類型不一致引起謂詞傳遞失敗

今天分享一個比較有意思的案例 注意&#xff1a;因為原始SQL很長&#xff0c;為了方便排版&#xff0c;簡化了SQL 下面SQL跑60秒才出結果&#xff0c;客戶請求優化 select dtcs.owner, dtcs.table_name, dtcs.column_name, dct.commentsfrom dba_tab_columns dtcsleft outer j…

01 相機標定與相機模型介紹

學完本文,您將了解不同相機模型分類、內參意義,及對應的應用代碼模型 標定的意義 建模三維世界點投影到二維圖像平面的過程。標定輸出的是相機模型。 相機模型 相機模型可以解理解為投影模型 +

Hyperlane:Rust Web開發的未來,釋放極致性能與簡潔之美

Hyperlane&#xff1a;Rust Web開發的未來&#xff0c;釋放極致性能與簡潔之美 你是否厭倦了復雜的Web框架&#xff0c;想要一個既高效又易用的工具來構建現代Web應用&#xff1f;Hyperlane正是你需要的答案&#xff01;作為專為Rust打造的輕量級、高性能HTTP服務器庫&#xf…

STM32學習筆記之振蕩器(原理篇)

&#x1f4e2;&#xff1a;如果你也對機器人、人工智能感興趣&#xff0c;看來我們志同道合? &#x1f4e2;&#xff1a;不妨瀏覽一下我的博客主頁【https://blog.csdn.net/weixin_51244852】 &#x1f4e2;&#xff1a;文章若有幸對你有幫助&#xff0c;可點贊 &#x1f44d;…

Stereolabs ZED Box Mini:機器人與自動化領域的人工智能視覺新選擇

在人工智能視覺技術快速發展的今天&#xff0c;其應用場景正在持續拓寬&#xff0c;從智能安防到工業自動化&#xff0c;從機器人技術到智能交通&#xff0c;各領域都在積極探索如何利用這一先進技術。而 Stereolabs 推出的ZED Box Mini&#xff0c;正是一款專為滿足這些多樣化…

K8S學習之基礎五十九:部署gitlab服務

部署gitlab docker pull gitlab/gitlab-ce:latest docker tag gitlab/gitlab-ce:latest 172.16.80.140/gitlab/gitlab-ce:latest docker push 172.16.80.140/gitlab/gitlab-ce:latest docker run -d -p 443:443 -p 80:80 -p 222:22 --name gitlab --restart always -v /home/…

多線程 --- 多線程編程

在寫代碼的時候&#xff0c;可以使用多進程進行并發編程&#xff08;在Java中&#xff0c;不太推薦&#xff0c;很多很多關于進程相關的API&#xff0c;在Java標準庫中&#xff0c;都沒有提供&#xff09;&#xff0c;也可以使用多線程進行并發編程&#xff08;系統提供了多線程…

HTML~視頻音頻在網頁中不能自動播放

問題&#xff1a; autoplay是打開自動播放&#xff0c;但是發現加了關鍵詞還是沒有反應 原因&#xff1a; 現在瀏覽器禁止自動播放&#xff08;特別是帶聲音的&#xff09; 解決辦法&#xff1a; 可以添加muted 進行沒有聲音的自動播放

vue中上傳接口file表單提交二進制文件流

1.使用elementui上傳組件 要做一個選擇文件后&#xff0c;先不上傳&#xff0c;等最后點擊確定后&#xff0c;把file二進制流及附加參數一起提交上去。 首先使用elementui中的上傳組件&#xff0c;設置auto-uploadfalse&#xff0c;也就是選擇文件后不立刻上傳。 <el-uplo…

Flutter環境配置

配置環境變量 PUB_HOSTED_URLhttps://pub.flutter-io.cnFLUTTER_STORAGE_BASE_URLhttps://storage.flutter-io.cn 這個命令是用來配置 Flutter 的鏡像源地址&#xff0c;主要是為了解決在中國大陸地區訪問 Flutter 官方資源較慢的問題。 具體的操作如下&#xff1a; 右鍵點…

ngx_http_index_set_index

定義在 src\http\modules\ngx_http_index_module.c static char * ngx_http_index_set_index(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) {ngx_http_index_loc_conf_t *ilcf conf;ngx_str_t *value;ngx_uint_t i, n;ngx_http_inde…

數據庫的視圖有什么用?

數據庫的視圖&#xff08;View&#xff09;是一種虛擬表&#xff0c;它的內容由查詢定義&#xff0c;并不實際存儲數據&#xff0c;而是動態生成。視圖的主要作用如下&#xff1a; 1. 簡化復雜查詢 場景&#xff1a;當查詢涉及多表連接、復雜過濾或聚合操作時&#xff0c;SQL …

Ubuntu 24.04 安裝 Docker 詳細教程

前言 Docker 是目前最流行的容器化技術&#xff0c;它可以幫助開發者快速部署和運行應用程序。本文將詳細介紹在 Ubuntu 24.04 (Noble Numbat) 上安裝 Docker 的完整步驟&#xff0c;包括配置鏡像加速等實用技巧。 一、準備工作 1.1 系統要求 Ubuntu 24.04 LTS 具有 sudo 權…

鴻蒙進行視頻上傳,使用 request.uploadFile方法

一.拉起選擇器進行視頻選擇&#xff0c;并且創建文件名稱 async getPictureFromAlbum() {// 拉起相冊&#xff0c;選擇圖片let PhotoSelectOptions new photoAccessHelper.PhotoSelectOptions();PhotoSelectOptions.MIMEType photoAccessHelper.PhotoViewMIMETypes.VIDEO_TY…

C++ map容器總結

map基本概念 簡介&#xff1a; map中所有元素都是pair pair中第一個元素為key&#xff08;鍵值&#xff09;&#xff0c;起到索引作用&#xff0c;第二個元素為value&#xff08;實值&#xff09; 所有元素都會根據元素的鍵值自動排序 本質&#xff1a; map/multimap屬于關…

【Zookeeper搭建(跟練版)】Zookeeper分布式集群搭建

&#xff08;一&#xff09;克隆前的準備 1. 用 xftp 發送文件 2. 時間同步&#xff1a; sudo cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 3. zookpeeper 安裝 部署 呼應開頭發送的壓縮包&#xff0c;解壓&#xff1a; cd ~ tar -zxvf zookeeper-3.4.6.tar.g…

Flutter項目之頁面實現以及路由fluro

目錄&#xff1a; 1、項目代碼結構2、頁面編寫以及路由配置main.dart(入口文件)page_content.dartindex.dart&#xff08;首頁&#xff09;application.dart&#xff08;啟動加載類&#xff09;pubspec.yaml&#xff08;依賴配置文件&#xff09;login.dart&#xff08;登錄頁&…

記錄Jmeter 利用BeanShell 腳本解析JSON字符串

下載org.json包(文檔說明) #下載地址 https://www.json.org/ # github 地址 https://github.com/stleary/JSON-java # api 文檔說明 https://resources.arcgis.com/en/help/arcobjects-java/api/arcobjects/com/esri/arcgis/server/json/JSONObject.htmlBeanShell腳本 import…

uniapp動態循環表單校驗失敗:初始值校驗

問題現象 &#x1f4a5; 在實現動態增減的單價輸入表單時&#xff08;基于uv-form組件&#xff09;&#xff0c;遇到以下詭異現象&#xff1a; <uv-input>的v-model綁定初始值為數字類型時&#xff0c;required規則失效 ?數字類型與字符串類型校驗表現不一致 &#x1…