[20191013]oracle number型別儲存轉化指令碼.txt
[20191013]oracle number型別儲存轉化指令碼.txt
--//測試看看是否可以利用bc obase=100的輸出解決問題。另外以前指令碼忘記考慮尾數的四捨五入問題。
--//也許程式設計就是這樣,總有一些細節沒有考慮到...
--//程式碼如下num2raw_5.sh:
#! /bin/bash
#! number convert oracle raw.
odebug=${ODEBUG:-0}
# process input parameter ,delete "," and all spaces. save to variable v_num. and length to variable v_len.
v_num="$*"
v_num=${v_num//[, ]/}
# strip e or trailing 0s in decimals or 0000.000 output 0 ,
v_num=$(echo $v_num/1 + 0 | sed -e "s/[eE]+\?/*10^/" -e "s/^/scale=180;/" | bc | tr -d '\n\\\r' | sed -e "s/\.\([0-9]*[1-9]\)0\+$/.\1/" -e "s/\.0\+$//")
if [[ "$v_num" =~ ^-.*$ ]]; then
v_sign=1
v_num=${v_num:1:180}
else
v_sign=0
fi
if [ $odebug -eq 1 ] ; then
echo v_num="$v_num"
fi
v_res=""
if [ "$v_num" == "0" ]; then
v_res="80"
echo "$v_res"
exit 0
fi
v_pos=$(expr index $v_num ".")
if [ $v_pos -gt 1 ]; then
v_exp=$(( v_pos/2 ))
elif [ $v_pos -eq 0 ]; then
v_exp=$(( (${#v_num}+1) /2 ))
elif [ $v_pos -eq 1 ]; then
v_tmp1=${v_num:1:180}
v_tmp2=$(echo $v_tmp1 | sed 's/^0\+//g')
v_exp=$(( (${#v_tmp2} - ${#v_tmp1})/2 ))
fi
v_exp1=$(printf "%02x" $(( $v_exp+192 )))
if [ $v_sign -eq 1 ]; then
v_exp1=$(printf "%02x" $(( 0xff - 0x${v_exp1} )))
fi
v_res=${v_exp1}${v_res}
# oracle number type max length is 22 bytes (not 22 is 21 bytes??), 1 bytes exponent.
# bc不作四捨五入,要加5*10^-41解決問題。
#v_tmp=$(echo "scale=180 ; $v_num / 100^($v_exp) " | bc | tr -d '\n\\\r'| sed -e "s/\.\([0-9]*[1-9]\)0\+$/.\1/" -e "s/\.0\+$//" -e "s/^\.//")
v_tmp=$(echo "scale=180 ; a=$v_num / 100^($v_exp) +5*10^-41; scale=40;a/1 " | bc | tr -d '\n\\\r'| sed -e "s/\.\([0-9]*[1-9]\)0\+$/.\1/" -e "s/\.0\+$//" )
if [ $odebug -eq 1 ] ; then
echo v_num="$v_num" v_len="$v_len" v_exp="$v_exp" v_exp1="$v_exp1" v_tmp="$v_tmp"
fi
if [ $v_sign -eq 0 ]; then
v_res=${v_res}$(echo "obase=100;$v_tmp" | bc | tr -d "." | awk 'BEGIN{RS=" +"}/./{printf ",%02x", $1+1}')
else
v_res=${v_res}$(echo "obase=100;$v_tmp" | bc | tr -d "." | awk 'BEGIN{RS=" +"}/./{printf ",%02x", 101-$1}')
fi
if [ $v_sign -eq 1 -a ${#v_tmp} -lt 40 ]; then
v_res=${v_res}",""66"
fi
echo "$v_res"
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-2660866/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- [20190930]oracle number型別儲存轉化指令碼.txtOracle型別指令碼
- [20191003]oracle number型別儲存轉化指令碼.txtOracle型別指令碼
- [20190930]oracle raw型別轉化number指令碼.txtOracle型別指令碼
- [20191219]oracle timestamp資料型別的儲存.txtOracle資料型別
- [20241009]oracle timestamp with time zone資料型別的儲存.txtOracle資料型別
- 【NUMBER】Oracle資料庫最佳化之理解NUMBER儲存機制Oracle資料庫
- [20191001]關於oracle number型別的一些疑惑.txtOracle型別
- ORACLE NUMBER資料型別Oracle資料型別
- Oracle的number資料型別Oracle資料型別
- Oracle基本資料型別儲存格式淺析——RAW型別Oracle資料型別
- [20221012]簡單探究nvarchar2資料型別儲存.txt資料型別
- jsp頁面number型別自動轉為String型別JS型別
- 建立NFS型別的儲存NFS型別
- 【轉】ORACLE資料型別Oracle資料型別
- 10_深入解析Oracle number資料型別及os層number解析工具分享Oracle資料型別
- 使用ORACLE ASMFD配置ORACLE儲存標準化OracleASM
- JS中其他資料型別轉為number資料型別的方法JS資料型別
- Block型別及儲存區域BloC型別
- JavaScript中的資料型別-儲存差別JavaScript資料型別
- [20210902]library_cache物件級別轉儲.txt物件
- SAP EWM - 儲存型別 - 入庫控制型別
- mysql儲存日期使用什麼型別MySql型別
- redis-4.資料儲存型別Redis型別
- Redis常用資料型別及其儲存結構(原始碼篇)Redis資料型別原始碼
- 加速全球數字化轉型,HPE智慧儲存平臺引領新時代儲存變革
- 軟體定義儲存加碼資料治理 助推金融機構數字化轉型
- [20201007]exadata儲存索引.txt索引
- 淺析number型別的值型別
- Oracle blob型別資料轉換成 base64編碼Oracle型別
- Mesh-gpt(點處理、儲存指令碼,Transformer)GPT指令碼ORM
- C#引用型別和值型別在堆、棧中的儲存C#型別
- Oracle儲存過程Oracle儲存過程
- Golang的值型別和引用型別的範圍、儲存區域、區別Golang型別
- CAPL指令碼中常用到的資料型別轉換——數字型別(int/double)和字串型別(char array)指令碼資料型別字串
- 作用域、連結屬性和儲存型別型別
- 基本資料型別轉化資料型別
- sqlserver資料庫還原儲存過程指令碼SQLServer資料庫儲存過程指令碼
- JS -- number資料型別詳解JS資料型別