fix price seperation
This commit is contained in:
parent
b406f1d7c4
commit
65cc48769d
1 changed files with 144 additions and 0 deletions
144
static/assets/js/number-formatter.js
Normal file
144
static/assets/js/number-formatter.js
Normal file
|
|
@ -0,0 +1,144 @@
|
|||
/**
|
||||
* Number Formatter Utility
|
||||
* Formats numbers with comma separators for better readability
|
||||
*/
|
||||
|
||||
// Format number with comma separators (e.g., 1234567 -> 1,234,567)
|
||||
function formatNumber(num) {
|
||||
if (!num) return '';
|
||||
return num.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',');
|
||||
}
|
||||
|
||||
// Remove comma separators from formatted number
|
||||
function unformatNumber(str) {
|
||||
if (!str) return '';
|
||||
return str.replace(/,/g, '');
|
||||
}
|
||||
|
||||
// Extract only digits from any string
|
||||
function extractDigits(str) {
|
||||
if (!str) return '';
|
||||
return str.replace(/\D/g, '');
|
||||
}
|
||||
|
||||
// Initialize number formatting for specified input selectors
|
||||
function initNumberFormatting(selectors) {
|
||||
if (typeof $ === 'undefined') {
|
||||
console.warn('jQuery not found. Number formatting requires jQuery.');
|
||||
return;
|
||||
}
|
||||
|
||||
$(document).ready(function() {
|
||||
selectors.forEach(function(selector) {
|
||||
// Store cursor position to maintain it after formatting
|
||||
function setCursorPosition(input, pos) {
|
||||
if (input.setSelectionRange) {
|
||||
input.setSelectionRange(pos, pos);
|
||||
}
|
||||
}
|
||||
|
||||
$(selector).on('input', function(e) {
|
||||
let input = $(this);
|
||||
let inputElement = this;
|
||||
let value = input.val();
|
||||
let cursorPos = inputElement.selectionStart;
|
||||
|
||||
// Extract only digits
|
||||
let digitsOnly = extractDigits(value);
|
||||
|
||||
// Store raw value
|
||||
input.attr('data-raw-value', digitsOnly);
|
||||
|
||||
// Format and set the value
|
||||
let formattedValue = formatNumber(digitsOnly);
|
||||
input.val(formattedValue);
|
||||
|
||||
// Adjust cursor position
|
||||
let oldLength = value.length;
|
||||
let newLength = formattedValue.length;
|
||||
let newCursorPos = cursorPos + (newLength - oldLength);
|
||||
|
||||
// Make sure cursor position is valid
|
||||
if (newCursorPos < 0) newCursorPos = 0;
|
||||
if (newCursorPos > newLength) newCursorPos = newLength;
|
||||
|
||||
// Set cursor position after a short delay
|
||||
setTimeout(function() {
|
||||
setCursorPosition(inputElement, newCursorPos);
|
||||
}, 1);
|
||||
});
|
||||
|
||||
// Handle paste events
|
||||
$(selector).on('paste', function(e) {
|
||||
let input = $(this);
|
||||
setTimeout(function() {
|
||||
let value = input.val();
|
||||
let digitsOnly = extractDigits(value);
|
||||
input.attr('data-raw-value', digitsOnly);
|
||||
input.val(formatNumber(digitsOnly));
|
||||
}, 1);
|
||||
});
|
||||
});
|
||||
|
||||
// Before form submission, replace formatted values with raw values
|
||||
$('form').on('submit', function() {
|
||||
selectors.forEach(function(selector) {
|
||||
let input = $(selector);
|
||||
let rawValue = input.attr('data-raw-value');
|
||||
if (rawValue) {
|
||||
input.val(rawValue);
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
// Helper function to get raw value from formatted input
|
||||
function getRawValue(input) {
|
||||
return $(input).attr('data-raw-value') || unformatNumber($(input).val());
|
||||
}
|
||||
|
||||
// Helper function to set raw value before AJAX submission
|
||||
function setRawValuesForSubmission(selectors) {
|
||||
selectors.forEach(function(selector) {
|
||||
let input = $(selector);
|
||||
let rawValue = input.attr('data-raw-value');
|
||||
if (rawValue) {
|
||||
input.val(rawValue);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Helper function to restore formatted values after AJAX submission
|
||||
function restoreFormattedValues(selectors) {
|
||||
selectors.forEach(function(selector) {
|
||||
let input = $(selector);
|
||||
let rawValue = input.attr('data-raw-value');
|
||||
if (rawValue) {
|
||||
input.val(formatNumber(rawValue));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Auto-initialize for common amount input selectors
|
||||
$(document).ready(function() {
|
||||
const commonSelectors = [
|
||||
'#id_amount',
|
||||
'#id_charge_amount',
|
||||
'input[name="amount"]',
|
||||
'input[name="unit_price"]',
|
||||
'input[name="price"]'
|
||||
];
|
||||
|
||||
initNumberFormatting(commonSelectors);
|
||||
|
||||
// Make helper functions globally available for AJAX forms
|
||||
window.formatNumber = formatNumber;
|
||||
window.unformatNumber = unformatNumber;
|
||||
window.getRawValue = getRawValue;
|
||||
// Avoid name collision causing recursion by aliasing helpers
|
||||
const __nf_setRawValuesForSubmission = setRawValuesForSubmission;
|
||||
const __nf_restoreFormattedValues = restoreFormattedValues;
|
||||
window.setRawValuesForSubmission = function() { __nf_setRawValuesForSubmission(commonSelectors); };
|
||||
window.restoreFormattedValues = function() { __nf_restoreFormattedValues(commonSelectors); };
|
||||
});
|
||||
Loading…
Add table
Add a link
Reference in a new issue