تمرين إعادة البناء
Bank Ledger
أعد كتابة دفتر حسابات بسيط يستخدم الهللات كأعداد صحيحة ويحسب الرصيد.
rust
~20 دقيقة
متوسط
أعد بناء الكود
Rebuild
هذا هو الكود. اكتبه بنفسك.
الكود المرجعي
use std::env;
use std::fs;
use std::io;
#[derive(Debug)]
struct Entry {
date: String,
description: String,
halalas: i64,
}
fn main() -> io::Result<()> {
let path = env::args()
.nth(1)
.unwrap_or_else(|| "ledger.csv".to_string());
let data = fs::read_to_string(path).unwrap_or_else(|_| sample_ledger());
let entries = parse_entries(&data);
let mut balance = 0i64;
for entry in entries {
balance += entry.halalas;
println!(
"{} | {:<18} | {:>10} | balance {}",
entry.date,
entry.description,
format_money(entry.halalas),
format_money(balance)
);
}
Ok(())
}
fn parse_entries(data: &str) -> Vec<Entry> {
data.lines()
.skip(1)
.filter_map(|line| {
let fields: Vec<_> = line.split(',').map(str::trim).collect();
Some(Entry {
date: fields.get(0)?.to_string(),
description: fields.get(1)?.to_string(),
halalas: fields.get(2)?.parse().ok()?,
})
})
.collect()
}
fn sample_ledger() -> String {
"date,description,halalas\n2026-01-01,Opening,100000\n2026-01-03,Supplies,-2450\n2026-01-05,Sale,18500\n".to_string()
}
fn format_money(halalas: i64) -> String {
let sign = if halalas < 0 { "-" } else { "" };
let value = halalas.abs();
format!("{sign}{}.{:02}", value / 100, value % 100)
}اكتب هنا