3.3 Casting and Parsing
Data จริงมาเป็น text เสมอ — CSV, form input, API response — ก่อนทำอะไรได้ คุณต้อง แปลง มันให้เป็น number ก่อน
Casting vs Parsing
Section titled “Casting vs Parsing”- Casting = บอกคอมพิวเตอร์ว่า “มองข้อมูลนี้เป็นอีก type หนึ่ง” (เช่น int → float)
- Parsing = อ่าน text แล้วพยายามแปลงเป็น number (เช่น
"123"→123)
ทั้งสองอาจ ล้มเหลว ได้ — "hello" แปลงเป็น number ไม่ได้ สิ่งที่สำคัญคือ: ล้มเหลวแบบไหน?
ตารางเปรียบเทียบ
Section titled “ตารางเปรียบเทียบ”| การแปลง | Google Sheets | pandas (Python) | SQL |
|---|---|---|---|
| Text → Number | VALUE("123") | pd.to_numeric("123") | CAST('123' AS INTEGER) |
| Fail safely | IFERROR(VALUE("abc"), 0) | pd.to_numeric(s, errors="coerce") | TRY_CAST('abc' AS INTEGER) |
| Number → Text | TO_TEXT(123) หรือ TEXT(123, "0") | s.astype("string") | CAST(123 AS VARCHAR) |
พิมพ์ในเซลล์:
=VALUE("42") → 42 (number)=VALUE("42.5") → 42.5=VALUE("hello") → #VALUE! error!=IFERROR(VALUE("hello"), 0) → 0 (fail safely)แปลง number กลับเป็น text:
=TO_TEXT(42) → "42" (text)=TEXT(1234.5, "#,##0.00") → "1,234.50" (formatted text)สถานการณ์จริง: คุณ import CSV ที่มี column “price” แต่ Sheets เก็บเป็น text — ใช้ VALUE() แปลงทั้งคอลัมน์:
=ARRAYFORMULA(IFERROR(VALUE(A2:A100), ""))#include <stdio.h>#include <stdlib.h>
int main() { // text → number char *text = "42"; int num = atoi(text); printf("%d\n", num); // 42
// atoi กับ text ที่ไม่ใช่ number — อันตราย! printf("%d\n", atoi("hello")); // 0 (ไม่มี error — แค่ return 0) printf("%d\n", atoi("42abc")); // 42 (อ่านแค่ส่วนหน้า!)
// ปลอดภัยกว่า: ใช้ strtol char *end; long val = strtol("42abc", &end, 10); printf("parsed: %ld, leftover: '%s'\n", val, end); // parsed: 42, leftover: 'abc'
// number → text char buf[20]; sprintf(buf, "%d", 123); printf("as text: %s\n", buf); // "123" return 0;}C ไม่มี “fail safely” แบบอัตโนมัติ — atoi("hello") return 0 โดยไม่บอกว่ามันผิด ใช้ strtol แทนเพื่อเช็ค leftover
import pandas as pd
# text → number (Python built-in)int("42") # 42float("42.5") # 42.5# int("hello") # ValueError! crash!
# pandas — แปลงทั้ง columns = pd.Series(["10", "20", "abc", "40", None])
# errors="raise" (default) — crash ถ้ามี bad value# pd.to_numeric(s) # ValueError!
# errors="coerce" — แปลงไม่ได้ = NaNresult = pd.to_numeric(s, errors="coerce")print(result)# 0 10.0# 1 20.0# 2 NaN ← "abc" กลายเป็น NaN# 3 40.0# 4 NaN ← None ก็เป็น NaN# dtype: float64
# errors="ignore" — ไม่แปลงเลย ส่ง original กลับมา (อันตราย!)
# number → textresult.astype("string")# 0 10.0# 1 20.0# 2 <NA># 3 40.0# 4 <NA># dtype: string-- text → numberSELECT CAST('42' AS INTEGER); -- 42-- SELECT CAST('hello' AS INTEGER); -- ERROR! crash query
-- fail safely ด้วย TRY_CAST (SQL Server, some dialects)SELECT TRY_CAST('hello' AS INTEGER); -- NULL (ไม่ crash)
-- PostgreSQL ไม่มี TRY_CAST แต่ใช้ CASE ได้SELECT CASE WHEN price_text ~ '^\d+\.?\d*$' THEN CAST(price_text AS NUMERIC) ELSE NULL END AS price_cleanFROM raw_data;
-- number → textSELECT CAST(123 AS VARCHAR); -- '123'SELECT CAST(45.67 AS VARCHAR); -- '45.67'เมื่อไหร่ต้อง Cast/Parse?
Section titled “เมื่อไหร่ต้อง Cast/Parse?”| สถานการณ์ | ทำอะไร |
|---|---|
| Import CSV ที่ทุกอย่างเป็น text | Parse text → number |
| รวมตาราง number กับ text column | Cast ให้ตรงกัน |
| แสดงผล number ใน report | Cast number → text + format |
| เจอ mixed data (มีทั้ง number และ “N/A”) | Parse ด้วย coerce/IFERROR |