internal/functions/generators/New-SldgNumber.ps1
|
function New-SldgNumber { <# .SYNOPSIS Generates numbers based on semantic type and SQL data type constraints. #> [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSReviewUnusedParameter', 'Precision', Justification = 'Used to define decimal range')] [CmdletBinding()] param ( [ValidateSet('Integer', 'Decimal', 'Money', 'Quantity', 'Percentage', 'Age', 'Boolean')] [string]$Type = 'Integer', $Minimum, $Maximum, [int]$Precision = 18, [int]$Scale = 2, [int]$Count = 1 ) for ($i = 0; $i -lt $Count; $i++) { switch ($Type) { 'Integer' { $min = if ($null -ne $Minimum) { [int]$Minimum } else { 1 } $max = if ($null -ne $Maximum) { [int]$Maximum } else { 10000 } if ($min -gt $max) { $min, $max = $max, $min } [int](Get-Random -Minimum ([long]$min) -Maximum ([long]$max + 1)) } 'Decimal' { $min = if ($null -ne $Minimum) { [double]$Minimum } else { 0.0 } $max = if ($null -ne $Maximum) { [double]$Maximum } else { 10000.0 } if ($min -gt $max) { $min, $max = $max, $min } # Constrain range to Precision: DECIMAL(P,S) allows max magnitude 10^(P-S)-1 if ($Precision -gt 0 -and $Precision -gt $Scale) { $maxMagnitude = [math]::Pow(10, $Precision - $Scale) - 1 $min = [math]::Max($min, -$maxMagnitude) $max = [math]::Min($max, $maxMagnitude) } [Math]::Round($min + (Get-Random -Minimum 0 -Maximum 10000) / 10000.0 * ($max - $min), $Scale) } 'Money' { $min = if ($null -ne $Minimum) { [decimal]$Minimum } else { 0.01 } $max = if ($null -ne $Maximum) { [decimal]$Maximum } else { 50000.00 } if ($min -gt $max) { $min, $max = $max, $min } [Math]::Round([decimal]$min + (Get-Random -Minimum 0 -Maximum 10000) / 10000.0 * ($max - $min), 2) } 'Quantity' { $min = if ($null -ne $Minimum) { [int]$Minimum } else { 1 } $max = if ($null -ne $Maximum) { [int]$Maximum } else { 500 } if ($min -gt $max) { $min, $max = $max, $min } [int](Get-Random -Minimum ([long]$min) -Maximum ([long]$max + 1)) } 'Percentage' { $min = if ($null -ne $Minimum) { [double]$Minimum } else { 0.0 } $max = if ($null -ne $Maximum) { [double]$Maximum } else { 100.0 } if ($min -gt $max) { $min, $max = $max, $min } [Math]::Round($min + (Get-Random -Minimum 0 -Maximum 10000) / 10000.0 * ($max - $min), 2) } 'Age' { $min = if ($null -ne $Minimum) { [int]$Minimum } else { 18 } $max = if ($null -ne $Maximum) { [int]$Maximum } else { 80 } if ($min -gt $max) { $min, $max = $max, $min } [int](Get-Random -Minimum ([long]$min) -Maximum ([long]$max + 1)) } 'Boolean' { [bool](Get-Random -Minimum 0 -Maximum 2) } } } } |