2022-04-15

【Kotlin】以程式方式取得 resource string 的值

平常我們是以

getString(R.string.id)

的方式取得 resource string 的值


resource id 的變數名是有規律的時候,我們能以程式的方式取得其值

假設我們的 /values/strings.xml 的內容如下

 
<string name="strResult1">三爻全陽,表示全動,是天體之象。</string>
<string name="strResult2">三爻全陰,表示全靜,是大地之象。</string>
<string name="strResult3">上爻為陽爻,中下爻為陰爻。</string>
<string name="strResult4">上爻為陰爻,中下爻為陽爻。</string>
<string name="strResult5">下爻為陽爻,中上爻為陰爻。</string>
<string name="strResult6">下爻為陰爻,中上爻為陽爻。</string>
<string name="strResult7">中爻為陽爻,上下爻為陰爻。</string>
<string name="strResult8">中爻為陰爻,上下爻為陽爻。</string>
 


MainActivity.kt
 
var ff = 1
var sResult = applicationContext.stringFromResourcesByName("strResult$ff")    // 傳回 "三爻全陽,表示全動,是天體之象。"

...
...

private fun Context.stringFromResourcesByName(resourceName: String): String {
    return try {
        val resourceId = resources.getIdentifier(
            resourceName,
            "string",
            "完整package name"
        )
        getString(resourceId)
    }
    catch (e: Resources.NotFoundException) {
        "未知錯誤"
    }
}
 

2022-04-09

【Python2】整數與浮點數的混合運算

若沒有額外的設定,Python2 只支援整數運算,所以

2328/80  等於 2328//80
 
from __future__ import division    # 這要寫在最前面, 啟用浮點數除法
import math

...
...

i0 = 2328
i1 = 2328 / 80    # 浮點數除法 29.1
i2 = 2328 // 80    # 整數除法 29
i3 = i1 - i2    # 0.1
i4 = int(math.floor(i3 * 80))    # floor 是將浮點數直接捨去小數部份,但會變成 8.0
                        # 所以再以 int() 取整數
print ("i1 = "+str(i1))    # 29.1
print ("i2 = "+str(i2))    # 29
print ("i3 = "+str(i3))    # 0.1
print ("i4 = "+str(i4))    # 8

2022-04-04

【Javascript】在字串前(後) 補相同 字元/字串 padStart() 和 padEnd()

 
// 2017 年, Javascript 已內建此功能
// 用法:
// 變數.padStart(字串長度,重複的字元或字串);
// 變數.padEnd(字串長度,重複的字元或字串);

var str  = '123';

str2 = str.padStart(10,'0');    // 最終字串長度為 10 字, 若原字串不足 10 字, 則在原字串前補 0 → 0000000123

str3 = str.padEnd(10,'x');    // 123xxxxxxx

str4 = str.padStart(10,'ab');    // abababa123
 

2022-04-02

【Javascript】以 3rd party 函式庫 Decimal() 進行 浮點數、整數 的混合運算

參考資料 ----

JavaScript 之浮點四捨五入花式地雷

decimal.js


當 整數遇上浮點數時,其運算結果往往是預期之外,目前可借助 第三方函式庫(或該說是 類別庫?) Decimal() 來維持 浮點數 與 整數的 混合運算 的精度。

簡單來說就是將每個數都轉換為  Decimal 類別,再進行運算。

這個函式庫採 MIT 授權,並開放原始碼,放在 GitHub,去官網下載後,上傳到您網站的指定目錄,例如:/js/
 
<script src='/js/decimal.js'></script>

...
...

<script>
ii = 9999
fPlate1 = Decimal(parseInt(ii)/80);    // 124.9875
fPlate2 = Decimal(Math.floor(parseInt(sPlate)/80));    // 9999 ÷ 80 的整數 = 124
fPlate3 = fPlate1.minus(fPlate2);    // 124.9875 - 124 = 0.9875
iPlate4 = fPlate3.times(80);    // 0.9875 × 80 = 79


// 注意:上述的數字都是 Decimal 類別
// 必須轉換為 int 才能進行 switch()
switch(parseInt(iPlate4))
{
    case 1: ...
        break;
    case 2: ...
        break;
    ...
}

...
...

</script>
 



【Javascript】以遞迴方式為字串補重複字元

2017Javascript 已內建有相同功能了。
請參考 在字串前(後) 補相同 字元/字串 padStart() 和 padEnd()
 
<script>
// 建立一個遞迴函式
function pad(str,max) 
{   // 當字串 str 長度小於 max 時,就在字串左方補 0 後回傳
    str = str.toString();
    return str.length<max ? pad("0" + str, max) : str;
}

...
...

myStr = "1";
myStr = pad(myStr,4);    // 指定 myStr 補 0 後的字串長度為 4 字元
</script>
 


2022-03-17

【CSS】以 CSS 樣式設定 實做 奇/偶 數列 不同顏色

CSS 真是博大精深啊~~~

 
<style>
/* 表格基本樣式 */
table.saledata
{
    font-family:verdana;
    font-size:11pt;
    border-collapse:collapse;
    border-color:rgb(153,153,153);
}

/* 表格標題欄樣式 */
table.saledata th
{
    font-weight: normal;
    background-color: #CCFFFF;
    text-align: center;
    border-color: rgb(153,153,153);
    border-width: 1px;
    border-style: solid;
}

/* 奇數列樣式 注意:tr:nth-child() 冒號兩邊不可有空白 */
table.saledata tr:nth-child(odd)
{
    background-color: #FFEEEE;
}

/* 單一儲存格樣式 */
table.saledata td
{
    padding: 6px;
    border-color: rgb(153,153,153);
    border-width: 1px;
    border-style: solid;
}
</style>
 

【Kotlin】格式化數字輸出

參考資料 ----
DecimalFormat
 
 
val number = 123456

var nf = DecimalFormat("00000000")    // 設定要輸入的格式, 例1: 若數字不足 8 位數時, 以 0 補足 8 位數
var str = nf.format(number)
Toast.makeText(this, "str = $str", Toast.LENGTH_LONG).show()    // → 00123456

nf = DecimalFormat("#,###.00000")    // 例2: 千位符, 4 位小數
str = nf.format(number)
Toast.makeText(this, "str = $str", Toast.LENGTH_LONG).show()    // → 123,456.0000
 

2022-03-15

【Android Studio】Installed Build Tools revision xx.x.x is corrupted 的解法

Installed Build Tools revision 32.0.0 is corrupted. Remove and install again using the SDK Manager.


找到您的 Android SDK build tools 的目錄,以老人家的環境為例


D:\android\sdk\build-tools\32.0.0\

會發現有個 d8.bat,改成 dx.bat


另外在

D:\android\sdk\build-tools\32.0.0\lib\

會發現有個 d8.jar,改成 dx.jar

2022-03-13

【PHP】以 mb_substr 擷取中文字串

要擷取字串中的部份文字,一般會使用 substr() 但若遇到中文時,常會有亂碼產生。

因此,要擷取中文字串時,應改用 mb_substr()

 
$str = '一二三四五六七八九';
$str = mb_substr($str, 0, 1, 'UTF-8');
 

2022-03-12

【Kotlin】奇妙的數字運算 Float, BigDecimal

最近遇到個題目,要進行數字運算,運算過程中會產生小數,如下:

2222 ÷ 80 後,扣除整數,只留下小數,再將小數 × 80

既然會產生小數,直覺就是將數字轉成 Float 運算,但算出來的結果卻不如預期
 
var ii = 2222

// 個別運算都正確
var i2 = (ii.toFloat()/80)	// 結果為 27.775
var i3 = ii/80	// 結果為 27

// 但擺在一起運算就出問題了
i4 = (ii.toFloat()/80) - (ii/80)    // 結果為 0.7749996, 而不是 0.775

// 做了各種嘗試後, toBigDecimal() 會維持數字的精度, 而不會產生預期外的結果
var i5 = (((ii.toFloat()/80).toBigDecimal() - (ii/80).toBigDecimal())*(80).toBigDecimal())    // 結果為 62.000
// 但我只要整數, 所以
var i5 = (((ii.toFloat()/80).toBigDecimal() - (ii/80).toBigDecimal())*(80).toBigDecimal()).toInt()