ผมต้องการแปลงโค้ด PHP จาก http://justmindthought.blogspot.com/2012/12/code-php.html มายังภาษา Python เพื่อนำมาใช้ในงานโมดูล NLP ของผม
การแปลงโค้ดข้ามภาษาด้วยมือตัวเองไม่เคยง่ายอย่างที่คิด
ผมได้ลองแปลงโดยใช้ความรู้ PHP และ Python ที่ผมมี ผมสรุปเป็นข้อ ๆ ได้ดังนี้
- เอา <? > ออก
- เปลี่ยน function เป็น def
- เอา $ เอาทั้งหมด
- เอา ; ด้านหลังสุด เอาทั้งหมด
- เปลี่ยน // เป็น # ทั้งหมด
- เปลี่ยน ++ เป็น +=1 (บวกเพิ่มอีก1)
- เปลี่ยนการดำเนินการ === เป็น ==
- เปลี่ยน .= เป็น + และเปลี่ยน . ในบรรทัดเดียวกัน เป็น +
- เปลี่ยน true , false ให้เป็น True , False
- ถ้ามี for loop แนะนำให้แปลงเป็น while ใน Python จะง่ายขึ้น
- จัดคำสั่งที่อยู่ใน {} ตาม Logic เดิมในรูปแบบ Python โดยห้ามปนกัน แล้วเอา {} เอา แทนที่ { ด้วย : หลังคำสั่ง
โค้ดเกือบสมบูรณ์ แต่ผมยังไม่ได้แปลงโค้ดอย่าง number_format() , array() , substr() , strpos() , intval() , fmod()
คำถามคือ เราจะต้องไล่เปิด docs ทั้ง PHP และ Python เพื่อเทียบคำสั่งว่าคำสั่งไหนมีหน้าที่ตรงกันไหม ? (ซึ่งจะต้องใช้เวลานานมาก ...)
ใคร ๆ คงไม่อยากตอบว่า ใช่
ผมขอแนะนำเว็บช่วยเทียบคำสั่ง PHP กับ Python ที่ชื่อว่า php2python.com ครับ
การใช้งานเว็บ php2python.com เราเพียงพิมพ์คำสั่ง PHP ลงไปในช่องค้นหา เช่น intval เว็บนี้จะมีคำแนะนำให้ว่า intval คือ int ใน Python นั่นเอง และจะบอกวิธีแปลงคำสั่งและอาจมีการสร้างคำสั่งเลียนแบบ PHP ใน Python ให้ใช้ด้วยครับ
จบปัญหานี้ แต่มีปัญหาที่ผมถือว่าใหญ่มาก ในการแปลงโค้ด PHP จาก http://justmindthought.blogspot.com/2012/12/code-php.html มายังภาษา Python คือ โค้ดนี้
$ret .= (($divider == 10) && ($d == 2)) ? "ยี่" :
((($divider == 10) && ($d == 1)) ? "" :
((($divider == 1) && ($d == 1) && ($ret != "")) ? "เอ็ด" : $number_call[$d]));
$ret .= ($d ? $position_call[$pos] : "");
โค้ดเหล่านี้หมายความว่าอะไร ... ????????????????????????????????
มันคือ PHP Shorthand If / Else อ่านได้ที่ http://www.wingfoss.in.th/content/short-if-else (ซึ่งแกะยากมาก) ตอนนี้ผมทำอะไรได้ ผมทำได้แค่เพียงไล่แกะทีละ () ลงไปเรื่อย ๆ ได้โค้ด Python ดังนี้ ????????????
if (divider == 10) and (d == 2):
ret += "ยี่"
elif (divider == 10) and (d == 1):
ret += ""
elif ((divider == 1) and (d == 1) and (ret != "")):
ret += "เอ็ด"
else:
ret += number_call[d]
if(d):
ret += position_call[pos]
else:
ret += ""
พอแปลงโค้ดเสร็จแล้วให้ลองรันเรียกใช้ฟังก์ชันดูครับ
โค้ดฉบับ Python :
import math
def number_format(num, places=0):
return '{:20,.2f}'.format(num)
# fork by http://justmindthought.blogspot.com/2012/12/code-php.html
def ThaiBahtConversion(amount_number):
amount_number = number_format(amount_number, 2).replace(" ","")
#print(amount_number)
pt = amount_number.find(".")
number,fraction = "",""
amount_number1 = amount_number.split('.')
if (pt == False):
number = amount_number
else:
amount_number = amount_number.split('.')
number = amount_number[0]
fraction = int(amount_number1[1]) #amount_number[pt:pt + 1]
ret = ""
number=eval(number.replace(",",""))
#print(type(number))
baht = ReadNumber(number)
if (baht != ""):
ret += baht + "บาท"
#print(amount_number)
satang = ReadNumber(fraction)
if (satang != ""):
ret += satang + "สตางค์"
else:
ret += "ถ้วน"
return ret
def ReadNumber(number):
position_call = ["แสน", "หมื่น", "พัน", "ร้อย", "สิบ", ""]
number_call = ["", "หนึ่ง", "สอง", "สาม","สี่", "ห้า", "หก", "เจ็ด", "แปด", "เก้า"]
number = number
ret = ""
if (number == 0): return ret
if (number > 1000000):
ret += ReadNumber(int(number / 1000000)) + "ล้าน"
number = int(math.fmod(number, 1000000))
divider = 100000
pos = 0
while(number > 0):
d=int(number/divider)
if (divider == 10) and (d == 2):
ret += "ยี่"
elif (divider == 10) and (d == 1):
ret += ""
elif ((divider == 1) and (d == 1) and (ret != "")):
ret += "เอ็ด"
else:
ret += number_call[d]
if(d):
ret += position_call[pos]
else:
ret += ""
number=number % divider
divider=divider / 10
pos += 1
return retprint(ThaiBahtConversion(85.75))
ผลลัพธ์
แปดสิบห้าบาทเจ็ดสิบห้าสตางค์
ลองแปลงโค้ดจาก PHP มาภาษา Python กันครับ
ติดตามบทความมต่อไปนะครับ
ชอบคุณครับ
บทความนี้เขียนโดย นาย วรรณพงษ์ ภัททิยไพบูลย์ชั้น ม.6 โรงเรียนนางรองปัจจุบัน กำลังศึกษาชั้นปีที่ 1 สาขาวิทยาการคอมพิวเตอร์และสารสนเทศ คณะวิทยาศาสตร์ประยุกต์และวิศวกรรมศาสตร์ มหาวิทยาลัยขอนแก่น วิทยาเขตหนองคาย อีเมล : [email protected]
0 ความคิดเห็น:
แสดงความคิดเห็น
แสดงความคิดเห็นได้ครับ :)