iT邦幫忙

7

利用動態繼承將字串數字轉換成國字

看了這篇手癢,也來寫寫看。
順便練習python的物件導向。(因為我很少用)
目標,將一個字串轉換成 Hans 物件,利用 hans 屬性存取,將字串中的數字轉成正楷國字,並保有 str 的方法。

# Hans物件,繼承str,並初始化。
class Hans(str):
	def __init__(self, string=""):
		super().__init__()


# 要動態增加的方法
def hans(string):
	import re
	h = ["零", "壹", "貳", "參", "肆", "伍", "陸", "柒", "捌", "玖"]
	for i in re.findall(r"\d", string):
		string = string.replace(i, h[int(i)])
	return string


# 將 hans 屬性化,並動態增加至 Hans
Hans.hans = property(hans)
# 輸出為「EEE測試壹貳參」,可以看到可以使用了 str 的內建方法 upper()
print(Hans("eee測試123").hans.upper())

附記:python內建物件不可以附加方法,所以不能用

str.hans = property(hans)

會報錯


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

2
Darwin Watterson
iT邦好手 1 級 ‧ 2018-04-19 11:55:27

C-like語言只要用個 Switch 就能搞定, 貼個 Java:

public class Num2Ch {
   public static String convertNum(Integer num) {
	  StringBuilder ch = new StringBuilder();
		 switch (num) {
			case 0: ch.append("零"); return ch.toString();
			case 1: ch.append("壹"); return ch.toString();
			case 2: ch.append("貳"); return ch.toString();
			case 3: ch.append("参"); return ch.toString();
			case 4: ch.append("肆"); return ch.toString();
			case 5: ch.append("伍"); return ch.toString();
			case 6: ch.append("陸"); return ch.toString();
			case 7: ch.append("柒"); return ch.toString();
			case 8: ch.append("捌"); return ch.toString();
			case 9: ch.append("玖"); return ch.toString();
			default: ch.append("請輸入數字0~9"); return ch.toString();
		}	
  }  
  
  public static void main(String[] args) {
		String s = "eee測試123";
		for (char e: s.toCharArray()) {
			if (String.valueOf(e).matches("\\d"))
                System.out.print(
                   Num2Ch.convertNum(Integer.parseInt(String.valueOf(e)))
                );
			else 
				System.out.print(String.valueOf(e).toUpperCase());
		}	
   }
} 

在此向沒有 select-case 語法的 "大蟒蛇" 致敬 ! "大蟒蛇程式設計師" 辛苦了 !
活在 C-like 下真幸福 ! XD

froce iT邦大師 1 級 ‧ 2018-04-19 12:03:38 檢舉

你跟題目要的不同喔,我是整個字串要做轉換,你這一次只能一個字吧。

一個字的版本,根本用不到switch case:

def int_to_hans(string):
    h = ["零", "壹", "貳", "參", "肆", "伍", "陸", "柒", "捌", "玖"]
    return h[int(string)]

更何況就算用elif去寫,出來的code也不會比你的長。

嗯,我是不知道活在C-like下的你有多幸福啦,不過要引戰的先去旁邊罰站好嗎?

Java 可以直接用Stream或collection去調整String List, 所以你所提的整個字串在Java中核心程式只需我列的那段, 其餘的交給Stream或collection及String物件去處理 ! 不用罰站, 只是語言的差異而已 ! 而 switch 最大的功用就是減少 if-else的判斷操作提高執行效率 ! 另外, 選對IDE, 程式碼的長短根本不是問題(大多是IDE自動串的), 執行效率又不見得越短越好, 寫出實用跟能解決問題的程式比較重要 ! 最後我一點都沒要引戰的意思, 不然幹麻跟 python programmer 致敬 !

我要留言

立即登入留言