I'm trying to print formatted output using PowerShell but for some reason, I can't wrap my head around it. Quantity column and Cost column need formatting but {1,-15:N4} doesn't work. I'm definitely doing something wrong here but tried a bunch of other stuff and doesn't work.
#file: daily_needs_store.ps1
#
Write-Output ("{0,29}" -f "Affordable Daily Needs")
Write-Output "This Program will prompt for 10 items."
Write-Output "Enter quantity of each item purchased."
$TaxRate1 = 8.25
[float]$breadCount = Read-Host ("{0,-50}" -f "How many loaves of Bread (`$1.75 each) ");
[float]$milkCount = Read-Host ("{0,-50}" -f "How many Gallons of Milk (`$3.29 each) ")
[float]$chipsCount = Read-Host ("{0,-50}" -f "How many Bags of Chips (`$4.19 each) ")
[float]$potatoesCount = Read-Host ("{0,-50}" -f "How many Pounds of Potatoes (`$1.49 each) ")
[float]$bananasCount = Read-Host ("{0,-50}" -f "How many Pounds of Bananas (`$0.49 each) ")
[float]$beefCount = Read-Host ("{0,-50}" -f "How many Pounds of Beef (`$5.29 each) ")
[float]$tomatoesCount = Read-Host ("{0,-50}" -f "How many Pounds of Tomatoes (`$0.99 each) ")
[float]$applesCount = Read-Host ("{0,-50}" -f "How many Pounds of Apples (`$1.29 each) ")
[float]$batteriesCount = Read-Host ("{0,-50}" -f "How many 2-packs of AA Batteries (`$2.39 each) ")
[float]$vitaminCount = Read-Host ("{0,-50}" -f "How many Bottles of Vitamin (`$4.89 each) ")
Write-Output ("{0,-50}" -f"======================================================")
Write-Output ("{0,29}" -f "Affordable Daily Needs")
Write-Output ("{0,28}" -f "4715 San Pedro Avenue")
Write-Output ("{0,29}" -f "San Antonio, TX 78217")
Write-Output ("{0,27}" -f "Phone: 210-128-1919")
Write-Output ("{0,-50}" -f"------------------------------------------------------")
[float]$total = 0.0;
$breadCost = $breadCount * 1.75
$total = $total $breadCost
$milkCost = $milkCount * 3.29
$total = $total $milkCost
$chipsCost = $chipsCount * 4.19
$total = $total $chipsCost
$potatoesCost = $potatoesCount * 1.49
$total = $total $potatoesCost
$bananasCost = $bananasCount * 0.49
$total = $total $bananasCost
$beefCost = $beefCount * 5.29
$total = $total $beefCost
$tomatoesCost = $tomatoesCount * 0.99
$total = $total $tomatoesCost
$applesCost = $applesCount * 1.29
$total = $total $applesCost
$batteriesCost = $batteriesCount * 2.39 * (1 ($TaxRate1/100))
$total = $total $batteriesCost
$vitaminCost = $vitaminCount * 4.89 * (1 ($TaxRate1/100))
$total = $total $vitaminCost
Write-Host ("{0,-10} {1,-15} {2,-25} {3,-32}" -f "Item", "Qty", "Price/Unit", "Cost" )
Write-Host ("{0,-50}" -f"------------------------------------------------------")
Write-Host ("{0,-10} {1,-15} {2,-25} {3,-32}" -f "Bread", "$breadCount", "`$1.75", "$breadCost" )
Write-Host ("{0,-10} {1,-15} {2,-25} {3,-32}" -f "Milk", "$milkCount", "`$3.29", "$milkCost" )
Write-Host ("{0,-10} {1,-15} {2,-25} {3,-32}" -f "Chips", "$chipsCount", "`$4.19", "$chipsCost" )
Write-Host ("{0,-10} {1,-15} {2,-25} {3,-32}" -f "Potatoes", "$potatoesCount", "`$1.49", "$potatoesCost" )
Write-Host ("{0,-10} {1,-15} {2,-25} {3,-32}" -f "Beef", "$beefCount", "`$5.29", "$beefCost" )
Write-Host ("{0,-10} {1,-15} {2,-25} {3,-32}" -f "Tomatoes", "$tomatoesCount", "`$0.99", "$tomatoesCost" )
Write-Host ("{0,-10} {1,-15} {2,-25} {3,-32}" -f "Apples", "$applesCount", "`$1.29", "$applesCost" )
Write-Host ("{0,-10} {1,-15} {2,-25} {3,-32}" -f "Batteries", "$batteriesCount", "`$2.39", "$batteriesCost" )
Write-Host ("{0,-10} {1,-15} {2,-25} {3,-32}" -f "Vitamins", "$vitaminCount", "`$4.89", "$vitaminCost" )
Write-Host ("{0,-50}" -f"------------------------------------------------------")
Write-Host ("{0,-10} {1,-92}" -f "Subtotal", "`$$total")
Write-Host ("{0,-10} {1,-92}" -f "Tax `@ 8.25`%", "`$$total")
I want the output to be like this:
CodePudding user response:
That's not how we do things in PowerShell. Your code is repetitive, hard to read and hard to maintain.
I'd start with something like this:
$Products = @'
Product,Price,TaxRate,Quantity
Bread,1.75,0,
Milk,3.29,0,
Chips,4.19,0,
Potatoes,1.49,0,
Batteries,2.39,8.25,
Vitamin,4.89,8.25,
'@ |
ConvertFrom-Csv
$ShoppingCart =
foreach ($item in $Products) {
[int]$Item.Quantity = Read-Host ('How many items of {0,9} (${1} each)' -f $Item.Product, $item.Price)
$item
}
$Checkout =
$ShoppingCart |
Select-Object -Property Product,Price,Quantity,
@{Name = 'SubTotal'; Expression = {[Math]::Round($([Float]$_.Price * [Int]$_.Quantity * (1 ($([Float]$_.TaxRate) / 100))),2)}}
$Total = ($Checkout | Measure-Object -Property Subtotal -Sum ).Sum
$Checkout
"`nTotal: {0}" -f $Total
The output would look something like this:
Product Price Quantity SubTotal
------- ----- -------- --------
Bread 1.75 5 8,75
Milk 3.29 4 13,16
Chips 4.19 3 12,57
Potatoes 1.49 6 8,94
Batteries 2.39 2 5,17
Vitamin 4.89 8 42,35
Total: 90,94
Of course there's room for improvement. ;-)
BTW: The output shows a comma as the decimal point because my language setting is not english! ;-)
CodePudding user response:
Working now, I needed to remove "" from variables so Powershell can interpret them as floats instead of a string.
#file: daily_needs_store.ps1
#
Write-Host ("`n{0,29}" -f "Affordable Daily Needs")
Write-Host "This Program will prompt for 10 items."
Write-Host "Enter quantity of each item purchased."
$TaxRate = 8.25
[float]$breadCount = Read-Host ("{0,-45}" -f "How many loaves of Bread (`$1.75 each)")
[float]$milkCount = Read-Host ("{0,-45}" -f "How many Gallons of Milk (`$3.29 each)")
[float]$chipsCount = Read-Host ("{0,-45}" -f "How many Bags of Chips (`$4.19 each)")
[float]$potatoesCount = Read-Host ("{0,-45}" -f "How many Pounds of Potatoes (`$1.49 each)")
[float]$bananasCount = Read-Host ("{0,-45}" -f "How many Pounds of Bananas (`$0.49 each)")
[float]$beefCount = Read-Host ("{0,-45}" -f "How many Pounds of Beef (`$5.29 each) ")
[float]$tomatoesCount = Read-Host ("{0,-45}" -f "How many Pounds of Tomatoes (`$0.99 each)")
[float]$applesCount = Read-Host ("{0,-45}" -f "How many Pounds of Apples (`$1.29 each)")
[float]$batteriesCount = Read-Host ("{0,-45}" -f "How many 2-packs of AA Batteries (`$2.39 each)")
[float]$vitaminCount = Read-Host ("{0,-45}" -f "How many Bottles of Vitamin (`$4.89 each)")
Write-Host ("{0,-50}" -f "===================================")
Write-Host ("{0,29}" -f "Affordable Daily Needs")
Write-Host ("{0,28}" -f "4715 San Pedro Avenue")
Write-Host ("{0,29}" -f "San Antonio, TX 78217")
Write-Host ("{0,27}" -f "Phone: 210-128-1919")
Write-Host ("{0,-50}" -f "-----------------------------------")
[float]$total = 0.0;
[float]$totalTax = 0.0;
[float]$subTotal = 0.0;
$breadCost = $breadCount * 1.75
$subTotal = $subTotal $breadCost
$milkCost = $milkCount * 3.29
$subTotal = $subTotal $milkCost
$chipsCost = $chipsCount * 4.19
$subTotal = $subTotal $chipsCost
$potatoesCost = $potatoesCount * 1.49
$subTotal = $subTotal $potatoesCost
$bananasCost = $bananasCount * 0.49
$subTotal = $subTotal $bananasCost
$beefCost = $beefCount * 5.29
$subTotal = $subTotal $beefCost
$tomatoesCost = $tomatoesCount * 0.99
$subTotal = $subTotal $tomatoesCost
$applesCost = $applesCount * 1.29
$subTotal = $subTotal $applesCost
$batteriesCost = $batteriesCount * 2.39
$subTotal = $subTotal $batteriesCost
$totalTax = $totalTax ($batteriesCost * (1 ($TaxRate/100)) - $batteriesCost)
$vitaminCost = $vitaminCount * 4.89
$subTotal = $subTotal $vitaminCost
$totalTax = $totalTax ($vitaminCost * (1 ($TaxRate/100)) - $vitaminCost)
$total = $subTotal $totalTax
Write-Host ("{0,-10} {1,4} {2,11} {3,6}" -f "Item", "Qty", "Price/Unit", "Cost" )
Write-Host ("{0,-50}" -f "-----------------------------------")
Write-Host ("{0,-10} {1,4:N1} {2,9} {3,8:N2}" -f "Bread", $breadCount, "`$1.75", $breadCost )
Write-Host ("{0,-10} {1,4:N1} {2,9} {3,8:N2}" -f "Milk", $milkCount, "`$3.29", $milkCost )
Write-Host ("{0,-10} {1,4:N1} {2,9} {3,8:N2}" -f "Chips", $chipsCount, "`$4.19", $chipsCost )
Write-Host ("{0,-10} {1,4:N1} {2,9} {3,8:N2}" -f "Potatoes", $potatoesCount, "`$1.49", $potatoesCost )
Write-Host ("{0,-10} {1,4:N1} {2,9} {3,8:N2}" -f "Beef", $beefCount, "`$5.29", $beefCost )
Write-Host ("{0,-10} {1,4:N1} {2,9} {3,8:N2}" -f "Tomatoes", $tomatoesCount, "`$0.99", $tomatoesCost )
Write-Host ("{0,-10} {1,4:N1} {2,9} {3,8:N2}" -f "Apples", $applesCount, "`$1.29", $applesCost )
Write-Host ("{0,-10} {1,4:N1} {2,9} {3,8:N2}" -f "Batteries", $batteriesCount, "`$2.39", $batteriesCost )
Write-Host ("{0,-10} {1,4:N1} {2,9} {3,8:N2}" -f "Vitamins", $vitaminCount, "`$4.89", $vitaminCost )
Write-Host ("{0,-50}" -f "-----------------------------------")
Write-Host ("{0,-10} {1,23:c2}" -f "Subtotal", $subTotal)
Write-Host ("{0,-10} {1,22:c2}" -f "Tax `@ 8.25`%", $totalTax)
Write-Host ("{0,-50}" -f "-----------------------------------")
Write-Host ("{0,-10} {1,23:c2}" -f "Total", $total)
Write-Host ("{0,-50}" -f"===================================")
Write-Host "Sales Clerk: John Doe"
Write-Host "Counter#: 7"
Write-Host "Date:"(Get-Date)
CodePudding user response:
- Reduce dashed lines to just 35 characters.
- REMOVE double quotes from all variables, the format operator -f thinks they are strings, but we want it to know that they are actually numbers.
- Do NOT place a dollar sign in front of total. Use the correct formatting strings.
- Use one type of formatting string on Qty column, but a different type for Cost column.
- Use negative alignment on first row, positive alignment for numbers/money.
- Reduce the size of most alignment numbers, that thing way too wide!
- You need 3 rows at the bottom, not 2. One for Subtotal, then Tax, and finally Total.
- Go to bed at decent hour, same time each night, and get at least 7.5 hours of sleep per night.