TryParse / readMaybe

TryParse เป็นฟังก์ชั่นสำหรับแปลง String ให้เป็น type ปลายทางตามที่ฟังก์ชั่นประกาศอยู่ เช่น Int32.TryParse ใช้แปลง String เป็น Int32, DateTime.TryParse แปลง String เป็น DateTime

ข้อดีของการใช้ TryParse คือ โปรแกรมจะไม่เกิด exception ขณะรันไทม์ ในกรณีที่ไม่สามารถแปลงอินพุต TryParse จะรีเทิร์นค่าเป็น false แทนการ throw exception (เหมือน Int32.Parse, Convert.ToInt32) ถ้าฟังก์ชั่นรีเทิร์น true จะมีการอัพเดตผลลัพธ์กลับมายังพารามิเตอร์ out

ตัวอย่างการแปลง String เป็น Int32

C#

C# เวอร์ชั่นเก่าต้องประกาศตัวแปร intValue ก่อนส่งเข้าไปในตำแหน่งพารามิเตอร์ out

var stringValue = "100";
var intValue = 0;
var success = Int32.TryParse(stringValue, out intValue);
if (success} ...

C# 7 สามารถประกาศ intValue ในแหน่ง out ได้เลย

var stringValue = "100";
var success = Int32.TryParse(stringValue, out var intValue);
if (success) ...

ถ้าต้องการละ ค่าที่แปลงออกมา ให้ใช้ _

var stringValue = "100";
var success = Int32.TryParse(stringValue, out _)
if (success) ...

สำหรับคนที่สนใจเรื่องประสิทธิภาพ ให้ใช้ TryParse ที่รับ NumberStyle และ CultureInfo ซึ่งจะเร็วกว่า TryParse แบบแรก

F#

F# ใช้วิธี Pass by reference แต่วิธีไม่นิยมใช้ เพราะต้องประกาศตัวแปร mutable ส่งเข้าไปในฟังก์ชั่น

let stringValue = "100"
let mutable intValue = 0
let success = Int32.TryParse(stringValue, &intValue)
if success then ...

แบบที่สอง จะใช้ความสามารถของคอมไพล์เลอร์ โดยพารามิเตอร์ out จะถูกตัดออก เหลือพารามิเตอร์ตัวเดียว คืออินพุตที่ต้องการแปลง โดย TryParse จะรีเทิร์นค่าเป็น tuple (bool, int)

let stringValue = "100"
let success, intValue = Int32.TryParse stringValue
if success then ...

Haskell

Haskell มีฟังก์ชั่นคล้ายกับ Convert.ToInt32 ของ .NET คือ read ที่จะเกิด exception ขี้นได้ หากอินพุตผิด

stringValue = "100."
intValue = read stringValue :: Int
** Exception: Prelude.read: no parse

มีวิธีที่ปลอดภัยว่า คือ ใช้ readMaybe โดย readMaby จะรีเทิร์นค่าเป็น Maybe (คล้าย Options ใน F#)

import Text.Read
intValue1 = readMaybe "100." :: Maybe Int -- Nothing
intValue2 = readMaybe "100" :: Maybe Int -- Just 100
case intValue1 of
Just value -> ...
Nothing -> ...

ถ้าต้องการเอาท์พุตเป็น tuple (Bool, Int) เหมือน F# ทำได้โดยใช้ฟังก์ชั่น reads

tryParse :: String -> (Bool, Int)
tryParse value =
case reads value of
[ (v, "") ] -> (True, v)
_ -> (False, 0)
(success, value) = tryParse "100"    -- (True, 100)
(success, value) = tryParse "100." -- (False, 0)
One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.