// bill.go
package main
import (
"fmt"
)
type bill struct {
name string
items map[string]float64
tip float64
}
// format the bill
func (b bill) format() string {
fs := "Bill breakdown: \n"
var total float64 = 0
// list items
for k, v := range b.items {
fs += fmt.Sprintf("%-25v ...$%v \n", k+":", v)
total += v
}
// add tip
fs += fmt.Sprintf("%-25v ...$%v \n", "tip:", b.tip)
// total
fs += fmt.Sprintf("%-25v ...$%0.2f", "total:", total+b.tip)
return fs
}
// make new bills
func newBill(name string) bill {
b := bill{
name: name,
items: map[string]float64{},
tip: 0,
}
return b
}
// update tip
func (b *bill) updateTip(tip float64) {
b.tip = tip
}
// add an item to the bill
func (b *bill) addItem(name string, price float64) {
b.items[name] = price
}
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
// Helper function
func getInput(prompt string, r *bufio.Reader) (string, error) {
fmt.Print(prompt)
input, err := r.ReadString('\n')
return strings.TrimSpace(input), err
}
func createBill() bill {
reader := bufio.NewReader(os.Stdin)
name, _ := getInput("Create a new bill name: ", reader)
b := newBill(name)
fmt.Println("Created the bill - ", b.name)
return b
}
// save bill
func (b bill) save() {
data := []byte(b.format())
err := os.WriteFile(b.name+".txt", data, 0644)
if err != nil {
panic(err)
}
fmt.Println("bill was saved to file.")
}
func promptOptions(b bill) {
reader := bufio.NewReader(os.Stdin)
opt, _ := getInput("Choose option (a - add item, s - save bill, t - add tip)", reader)
switch opt {
case "a":
name, _ := getInput("Item name: ", reader)
price, _ := getInput("Item price: ", reader)
p, err := strconv.ParseFloat(price, 64)
if err != nil {
fmt.Println("The price must be a number")
promptOptions(b)
}
b.addItem(name, p)
fmt.Println("item added - ", name, price)
promptOptions(b)
case "t":
tip, _ := getInput("Enter tip amount ($):", reader)
t, err := strconv.ParseFloat(tip, 64)
if err != nil {
fmt.Println("The tip must be a number")
promptOptions(b)
}
b.updateTip(t)
fmt.Println("tip added - ", tip)
promptOptions(b)
case "s":
b.save()
fmt.Println("you save the file - ", b.name+".txt")
default:
fmt.Println("that was not a valid option...")
promptOptions(b)
}
}
func main() {
mybill := createBill()
promptOptions(mybill)
}
// 결과
//
// Create a new bill name: luigi
// Created the bill - luigi
// Choose option (a - add item, s - save bill, t - add tip)a
// Item name: veg stew
// Item price: 6.99
// item added - veg stew 6.99
// Choose option (a - add item, s - save bill, t - add tip)a
// Item name: toffee pudding
// Item price: 5.25
// item added - toffee pudding 5.25
// Choose option (a - add item, s - save bill, t - add tip)t
// Enter tip amount ($):7
// tip added - 7
// Choose option (a - add item, s - save bill, t - add tip)s
// bill was saved to file.
// you save the file - luigi.txt
댓글 영역