练习2.2
描述: 写一个通用的单位转换程序,用类似cf程序的方式从命令行读取参数,如果缺省的
话则是从标准输入读取参数,然后做类似Celsius和Fahrenheit的单位转换,长度单位可以对
应英尺和米,重量单位可以对应磅和公斤等。
代码:
utilconv.go
package utilconv
//长度
type Feet float64
type Meter float64
//重量
type Pound float64
type Kilogram float64
// FToM converts a Celsius temperature to Fahrenheit.
func FToM(f Feet) Meter { return Meter(f * 0.3048) }
// MToF converts a Fahrenheit temperature to Celsius.
func MToF(m Meter) Feet { return Feet(m / 0.3048) }
//PToK
func PToK(p Pound) Kilogram { return Kilogram(p / 2.20462) }
//KToP
func KToP(k Kilogram) Pound {
return Pound(k * 2.20462)
}
main.go
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
"studyTest/ch2/utilconv"
)
func main() {
if len(os.Args) > 1 {
for _, arg := range os.Args[1:] {
input, err := strconv.ParseFloat(arg, 64)
if err != nil {
fmt.Fprintf(os.Stderr, "cf: %v\n", err)
os.Exit(1)
}
m := utilconv.Meter(input)
k := utilconv.Kilogram(input)
fmt.Printf("%.2f m = %.2f f, %.2f kg = %.2f p\n",
m, utilconv.MToF(m), k, utilconv.KToP(k))
}
} else { //这里else要接在}后面,否则会报错
scanner := bufio.NewScanner(os.Stdin)
var numbers []float64
for scanner.Scan() {
input := scanner.Text()
if num, err := strconv.ParseFloat(strings.TrimSpace(input), 64); err == nil {
numbers = append(numbers, num)
} else {
// 非浮点数输入,结束读取
break
}
}
for _, input := range numbers {
m := utilconv.Meter(input)
k := utilconv.Kilogram(input)
fmt.Printf("%.2f m = %.2f f, %.2f kg = %.2f p\n",
m, utilconv.MToF(m), k, utilconv.KToP(k))
}
}
运行:
命令行参数传递:
标准输入:
知识点
strconv.PraseFloat(str,64)这条语句能够使得字符串转化为64位的浮点数。